Пул потоков: как порождать дочернюю задачу из запущенной задачи? - PullRequest
1 голос
/ 24 декабря 2010

Простой пул потоков с глобальной общей очередью задач (функторов).

Каждый работник (поток) заберет одну задачу у работника и выполнит ее. Следующая задача не будет выполнена, пока эта задача не будет завершена.

Давайте представим себе большую задачу, которая должна порождать дочерние задачи для получения некоторых данных, а затем продолжить оценку (например, отсортировать большой массив перед сохранением на диск).

псевдокод кода задачи:

  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. отредактировал некоторые плохие имена

1 Ответ

0 голосов
/ 25 декабря 2010

У вас может быть механизм, чтобы дочерние потоки сообщали основному рабочему, когда они это сделали, чтобы он мог продолжить.В Java задачи Callable , отправленные в пул потоков ExecutorService , возвращают свои результаты в виде структур данных Future s.Другой подход заключается в том, чтобы поддерживать отдельный сигнал завершения, похожий на CountDownLatch , который будет служить общим механизмом обратного отсчета, который будет обновляться каждый раз при завершении потока.

...