3

В C++, в чем разница между делением и завоеванием & вилкой и присоединиться? Является вилкой и присоединяется к конкретному случаю разделить и побеждать, потому что fork и join применяются только в параллелизме? Благодаря!Разница разделить и покорить & вилку и присоединиться

+1

Две вещи: во-первых, пожалуйста, вычистить 'join',' difference', и 'divide', поскольку их отрывки тегов довольно четко определяют их как не связанные с вашей проблемой. Ну, за исключением 'divide', и это всего лишь плохой тег. Во-вторых, это языковой или языковой агностик? Если это последний, явным образом заявляю об этом. Если это первый, добавьте тег для языка. –

+0

@QPaysTaxes: Для чего это стоит, есть тег [tag: language-agnostic]. – eggyal

+0

@eggyal Huh. Я этого никогда не знал. Затем OP должен добавить этот тег. –

ответ

1

В основном, Fork-Join разбивает задачу на мини-задачи, пока мини-задача не будет достаточно простой, чтобы ее можно было решить без дальнейших сбоев. Это похоже на алгоритм разделения и покоя. В этой концепции важно отметить, что в идеале ни один рабочий поток не работает. Они внедряют алгоритм поиска работы, в котором простаивающие работники похищают работу у тех рабочих, которые заняты.

Result solve(Problem problem) 
    { 
     if (problem is small) 
      directly solve problem 
     else 
      { 
      split problem into independent parts 
      fork new subtasks to solve each part 
      join all subtasks 
      compose result from subresults 
      } 
    } 

C++ 14 имеет некоторые проблемы, связанные с вилкой & присоединиться, вы можете прочитать с этого сайта (http://www.meetingcpp.com/index.php/br/items/a-look-at-c14-papers-part-2.html)

2

«Разделяй и властвуй» - это общий метод программирования для разбиения более крупной проблемы на более разрешимые подзадачи, решая их отдельно (а иногда и рекурсивно), наконец, создавая ответ на большую проблему, объединяя ответы на суб- проблемы. Это идея, не относящаяся к C++.

«Вилка» и «Присоединиться» к имени, которые используются на многих языках. «Вилка» вызывает запуск другого потока выполнения; «join» заставляет текущий поток ждать завершения и синхронизации другого потока. Я считаю, что в стандарте C++ 14 встроены такие примитивы. Многие другие langauges не имеют этого встроенного, но он часто доступен через библиотеки (включая более ранние версии C++).

Можно использовать «Вилку» и «Присоединиться», чтобы реализовать «Разделить и завоевать», усиленный параллелизмом. Используемый таким образом, «fork» отправляет потоки для разделения подпрограмм, а «join» необходимо в качестве шага для сигнального завершения подзадач. Но «join» специально не вычисляет комбинированный ответ на «большую» проблему. Вам, скорее всего, потребуется больше кода, чем просто fork и присоединиться.