2013-05-31 2 views
0

Будучи методом fork(); в пределах compute(), как получилось, что это не называется другой степенью параллелизма при каждом методе compute()? Возможно, есть логический флаг? EDIT:О каркасе fork-join

переопределение метода compute() классовой RecursiveTask: (псевдокод)

if {array.length<100) 
do it 
else 
divide array by 2; 
fork(); 
int righta = rightArray.compute(); 
int lefta =(Integer)leftArray.join(); 
return righta +lefta; 

Так в основном это является compute() метод, который вызывается рекурсивно и когда fork() происходит это делает возможным использование параллелизм и процесс этой задачи с другим ядром. Однако быть рекурсивным fork() следует вызывать все время, когда метод получает рекурсивно. Так что в реальности этого не бывает (не было бы смысла). Это связано с булевым флагом, который говорит, что fork уже активирован?

Заранее спасибо.

+1

Неясная ... Вы можете написать какой-нибудь псевдо-код, показывающий путь кода вам не понимаете и что вы в этом не понимаете? – fge

+0

ok редактирование ответа – Rollerball

+0

'fork()' вызывается только в том случае, если 'array.length> = 100'. Какая еще логика вам нужна? –

ответ

2

Посмотрите на API

class Fibonacci extends RecursiveTask<Integer> { 
    final int n; 
    Fibonacci(int n) { this.n = n; } 
    Integer compute() { 
    if (n <= 1) 
     return n; 
    Fibonacci f1 = new Fibonacci(n - 1); 
    f1.fork(); 
    Fibonacci f2 = new Fibonacci(n - 2); 
    return f2.compute() + f1.join(); 
    } 
} 

Каждый раз, когда compute() называется это место другого вычисления в другом потоке (или очереди) с помощью вилки. вычислить непрерывные вилки, пока не будет больше n, доступных для обработки. На этом этапе вычисление будет ждать, пока «правая» сторона не закончится, а f1.join() ждет окончания «левой» стороны.

Когда join вызывается оно будет на самом деле сделать joining нить выполнить более низкие задания уровня (ниже на бинарном дереве), давая вам параллелизм вы хотите

+0

с этим «Каждый раз, когда вычисляется вызов(), он поместит другое вычисление в другой поток (или очередь) через fork». вы имеете в виду, что каждое вычисление выполняется по отдельному потоку? – Rollerball

+0

Какова связь между fork() и многоядерным программированием? – Rollerball

+0

'fork()' будет вызывать задачу в рабочей очереди соединения fork для других потоков. Поэтому, если у вас есть 5 потоков и 10 вилок, 5 потоков будут выполняться и обрабатывать 10 вилок одновременно (в конечном итоге). –

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