线程池:如何从正在运行的任务中生成子任务?

时间:2010-12-24 20:20:02

标签: multithreading threadpool

一个简单的线程池,具有全局共享任务队列(仿函数)。

每个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。编辑了一些不好的名字

1 个答案:

答案 0 :(得分:0)

您可以有一种机制让子线程在完成后立即向主工作人员发出信号,以便继续进行。在Java中,提交给Callable线程池的ExecutorService任务以Future的数据结构作为结果回复。另一种方法是维护一个单独的完成信号,类似于CountDownLatch,它将作为每次线程完成时更新的公共倒计时机制。