一个简单的线程池,具有全局共享任务队列(仿函数)。
每个worker(线程)将从worker中获取一个任务,然后执行它。它不会执行下一个任务,直到完成这个任务。
让我们想象一个大任务,需要生成子任务来生成一些数据,然后继续评估(例如,在保存到磁盘之前对大数组进行排序)。
任务代码的伪代码:
do some stuff
generate a list of child tasks
threadpool.spawn (child tasks)
wait until they were executed
continue my task
问题是工作人员将死锁,因为任务正在等待子任务,并且线程池正在等待父任务结束,然后运行子任务。
一个想法是在spawn代码中运行子任务:
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 )
但我觉得这很有侵扰性......
任何意见?
概率pd。圣诞节快乐! PD2。编辑了一些不好的名字
答案 0 :(得分:0)
您可以有一种机制让子线程在完成后立即向主工作人员发出信号,以便继续进行。在Java中,提交给Callable线程池的ExecutorService任务以Future的数据结构作为结果回复。另一种方法是维护一个单独的完成信号,类似于CountDownLatch,它将作为每次线程完成时更新的公共倒计时机制。