2012-04-11 2 views
3

В статье Doug Lea "A Java Fork/Join Framework":Фрагмент о Fork-Join Framework

http://gee.cs.oswego.edu/dl/papers/fj.pdf

В 2,1 Рабочий-Stealing он говорит:

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

так может кто-нибудь сказать мне, где конкретно эти «другие задачи» взялось? являются ли они из очередей задач других рабочих? означает ли это, когда рабочий стол сталкивается с вызовом соединения, он переходит к «краже задач из других потоков» вместо «перехода к другим задачам в собственной очереди»?

+1

Возможно, вы захотите ознакомиться с документами cilk о краже работы, если хотите получить более подробную информацию об этом. Версия java не идентична работе leisersons, но совершенно аналогична, и leiserson описывает ее более подробно. – Voo

ответ

2

«Другие задачи» могут возникать из-за своего собственного детекса, когда есть ожидающие задачи, другие образы потока или из очереди отправки новых запросов.

Соединение() - довольно сложная процедура. Он включает в себя управление задачами, то есть возможность управлять задачами, когда они активны в обработке и приостанавливается, ожидая чего-то. Выполнение этого в приложении обычно не работает. (Операционные системы делают это хорошо, а Cilk, JCilk делают это с использованием компилятора/времени выполнения.) Дуг Ли использует «продолжения потоков», когда объединяет потоки рабочих потоков.

+0

Насколько я могу понять, как работают deques (очереди с двойным концом), только три операции поддерживаются deque: «pop», «push» и «steal» (или украдены), и все они работают только либо головная задача, либо хвостовая задача очереди. В этом случае, как рабочий поток пропускает головную задачу (если головная задача встречает операцию «присоединения») и выполняет «другие ожидающие задачи в одной очереди», а затем возвращается к пропущенной задаче? – njzhxf

+0

Верх deque используется только другими потоками, чтобы украсть работу. Нижняя часть deque используется только текущим потоком для добавления/опроса задач. Когда текущий опрос потока удаляет задачу. Если эта задача вызывает соединение(), текущий поток или «поток продолжения» ищет задачи в нижней части deque. Посмотрите на код. Это невероятно сложно. Особенно предлагаемая версия Java8. – edharned

0

Каждый рабочий поток в Fork/Join framework имеет очередь работы, которая реализуется с использованием Deque.

Каждый раз, когда создается новая задача (или подзадача), она помещается в головку собственной очереди. Когда задача завершает задачу и выполняет соединение с другой задачей, которая еще не завершена, она работает умнее. Поток выдает новую задачу из головы своей очереди и начинает выполнять , а не спать (чтобы дождаться завершения другой задачи). На самом деле, если очередь потока пуста, тогда поток выдает задачу из хвоста очереди, принадлежащей другому потоку. Это ничего, кроме алгоритма обработки работы.

Смежные вопросы