Распределение кучи является узким местом в моем приложении, и я хотел бы избежать их при отправке небольших задач в пул потоков.Уменьшение количества распределений кучи при постановке в очередь задач
Могу ли я использовать std::packaged_task
с распределителем стека? В каких условиях? Каковы плюсы и минусы этого выбора? Существуют ли лучшие альтернативы, чтобы избежать распределения кучи общего состояния std::future
оператором new
?
auto foo() {
arena<1024> buffer;
auto task = std::packaged_task<int()>{
std::allocator_arg_t,
arena_allocator{arena},
[]() -> int { return 5; }
};
auto f = task.get_future(); // is this future and its shared state stack allocated?
thread_pool.push_back(std::move(task));
// I will probably need to block before the stack goes out of scope..
return f.get();
}
Если вы собираетесь заблокировать ожидание выполнения другого потока для выполнения задачи, вы можете просто запустить задачу в этом потоке напрямую. Похоже, что это поражает весь смысл нескольких потоков. –
@IgorTandetnik Я собираюсь гарантировать, что вычисление закончится до возвращения, это не значит, что я буду ждать. Это позволяет мне делать что-то еще в этом потоке, в то время как некоторые вычисления выполняются в другом потоке или для запуска нескольких вычислений для нескольких потоков. Это также позволяет мне передавать будущее по стеку по мере его роста ... Или даже выполнить вычисление в отдельном потоке, если я гарантирую, что он завершится до того, как локальный стек, в котором живет разделенное состояние, будет недействительным. – gnzlbg