【发布时间】:2011-05-30 12:22:21
【问题描述】:
具有全局共享任务队列(函子)的简单线程池。
每个工作人员(线程)将从工作人员那里获取一项任务,并执行它。它不会执行下一个任务,直到这个任务完成。
让我们想象一个大任务需要产生子任务来产生一些数据,然后继续进行评估(例如,在保存到磁盘之前对大数组进行排序)。
任务代码的伪代码:
do some stuff
generate a list of child tasks
threadpool.spawn (child tasks)
wait until they were executed
continue my task
问题是worker会死锁,因为任务在等待子任务,而线程池在等待父任务结束,才运行子任务。
一个想法是在生成代码中运行子任务:
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。修改了一些不好的名字
【问题讨论】:
-
"问题是worker会死锁,因为任务在等待子任务,而线程池在等待父任务结束,才运行子任务。" - 这是你在做的假设吗?即使有父任务正在运行,也有线程池将运行子任务。 Java Executors 可以做到这一点。
-
这是什么cr*ppy线程池?需要一个线程在运行另一个线程之前完成的线程池不是线程池。
-
SB: ofc,但我正在用 c++ 编写自己的线程池,我在问如何自己实现该功能
-
Hans Passant:对不起,如果我没有解释自己......“工人”是一个线程,一个任务是一个由每个线程执行的“函子”。线程池将从队列中提取“函子”(任务)并执行它们。在当前任务完成之前,线程不会执行队列中的下一个任务。