В C++, в чем разница между делением и завоеванием & вилкой и присоединиться? Является вилкой и присоединяется к конкретному случаю разделить и побеждать, потому что fork и join применяются только в параллелизме? Благодаря!Разница разделить и покорить & вилку и присоединиться
ответ
В основном, 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)
«Разделяй и властвуй» - это общий метод программирования для разбиения более крупной проблемы на более разрешимые подзадачи, решая их отдельно (а иногда и рекурсивно), наконец, создавая ответ на большую проблему, объединяя ответы на суб- проблемы. Это идея, не относящаяся к C++.
«Вилка» и «Присоединиться» к имени, которые используются на многих языках. «Вилка» вызывает запуск другого потока выполнения; «join» заставляет текущий поток ждать завершения и синхронизации другого потока. Я считаю, что в стандарте C++ 14 встроены такие примитивы. Многие другие langauges не имеют этого встроенного, но он часто доступен через библиотеки (включая более ранние версии C++).
Можно использовать «Вилку» и «Присоединиться», чтобы реализовать «Разделить и завоевать», усиленный параллелизмом. Используемый таким образом, «fork» отправляет потоки для разделения подпрограмм, а «join» необходимо в качестве шага для сигнального завершения подзадач. Но «join» специально не вычисляет комбинированный ответ на «большую» проблему. Вам, скорее всего, потребуется больше кода, чем просто fork и присоединиться.
Две вещи: во-первых, пожалуйста, вычистить 'join',' difference', и 'divide', поскольку их отрывки тегов довольно четко определяют их как не связанные с вашей проблемой. Ну, за исключением 'divide', и это всего лишь плохой тег. Во-вторых, это языковой или языковой агностик? Если это последний, явным образом заявляю об этом. Если это первый, добавьте тег для языка. –
@QPaysTaxes: Для чего это стоит, есть тег [tag: language-agnostic]. – eggyal
@eggyal Huh. Я этого никогда не знал. Затем OP должен добавить этот тег. –