Я не думаю, что std::promise<void>
может быть использовано здесь, поскольку это скорее единичная вещь. После того, как результат установлен в будущем, он не может быть сброшен, и, следовательно, мы не можем дважды ждать одно и то же обещание.
Можно сделать следующее (счетчик должен быть безопасным для потоков, но я был ленивымчтобы сделать это прямо сейчас):
int finished_threads = 0;
auto handle_work = [&finished_threads](){
bool this_finished = false;
while (finished_threads < NUM_OF_THREADS) {
while (!work_queue.empty) {
if(this_finished) {
this_finished = false;
--finished_threads; // evil
}
T task = work_queue.pop();
handle_task(task);
}
if(!this_finished) {
this_finished = true;
++finished_threads; // evil
}
}
};
Это должно завершиться только после того, как все потоки закончили (как в: Они больше не обрабатывают задачу, и ее нет в очереди). Тогда никакое новое задание больше не будет помещено в очередь. Локальная переменная минимизирует доступ к разделяемой памяти.
Обратите внимание, что мой опыт в многопоточном программировании очень ограничен.