Простой пул потоков с глобальной общей очередью задач (функторов).
Каждый работник (поток) заберет одну задачу у работника и выполнит ее. Следующая задача не будет выполнена, пока эта задача не будет завершена.
Давайте представим себе большую задачу, которая должна порождать дочерние задачи для получения некоторых данных, а затем продолжить оценку (например, отсортировать большой массив перед сохранением на диск).
псевдокод кода задачи:
do some stuff
generate a list of child tasks
threadpool.spawn (child tasks)
wait until they were executed
continue my task
Проблема заключается в том, что рабочий заблокирует блокировку, поскольку задача ожидает дочернюю задачу, а пул потоков ожидает завершения родительской задачи перед запуском дочерней.
Одна из идей - запустить дочернюю задачу внутри кода вызова:
псевдокод threadpool.spawn:
threadpool.push (tasks)
while (not all incoming task were executed)
t = threadpool.pop()
t.run()
return (and continue executing parent task)
но как я могу узнать, что все задачи были выполнены эффективным способом?
Другая идея состоит в том, чтобы разделить родительскую задачу .. примерно так:
псевдокод задачи:
l = generate a list of child tasks
threadpool.push ( l , high priority )
t = create a task to work with generated data
threadpool.push (t , lo priority )
Но я нашел это довольно навязчивым ...
есть мнения?
оплаченный счастливого Рождества!
pd2. отредактировал некоторые плохие имена