#multithreading #barrier
#многопоточность #барьер
Вопрос:
Пакет параллелизма JDK, библиотека потоков Boost, библиотека потоков Perl (правда, не в Python) — все они реализуют барьер, я не сталкивался с необходимостью использования барьера, поэтому интересно, каким был бы типичный вариант использования в многопоточных приложениях.
Ответ №1:
Барьеры можно использовать повсеместно с помощью надуманных примеров, но вы часто будете использовать их в методе scatter / reduce, где перед продолжением требуются результаты разных потоков.
Например, если вы хотите распараллелить сортировку, вы могли бы разделить список n раз и запустить n потоков для сортировки их разделов и приостановить, когда все они закончат, они умрут, давая родительскому устройству знать, что наконец-то можно объединить отсортированные фрагменты. (Я знаю, что есть способы получше, но это одна реализация).
Другое место, где я это видел, — это в распараллеленных сетях, где вам приходится отправлять определенный объем данных на полезную нагрузку. Таким образом, интерфейс запустит n сегментов и будет ждать, пока они все заполнятся, прежде чем отправлять передачу. Когда вы думаете о разделенной строке T1, это вроде как имеет смысл, отправка одного пакета данных по 64 мультиплексированным разделам была бы лучше, чем отправка данных из 1 раздела (что, по сути, стоит столько же, поскольку пакет должен быть дополнен 0).
Надеюсь, это некоторые вещи, которые заставят вас задуматься об этой проблеме!
Ответ №2:
Пример: набор потоков работает одновременно для вычисления набора результатов, и указанный набор результатов (частично / полностью) требуется в качестве входных данных для следующего этапа обработки некоторым / всем потокам на «барьере».
Барьер упрощает синхронизацию нескольких потоков без необходимости создавать решение вокруг нескольких conditions
amp; mutexes
.
Хотя я не могу сказать, что видел barriers
часто. В какой-то момент, по мере роста числа потоков, возможно, стоило бы рассмотреть более «развязанную» систему для управления возможными взаимоблокировками.
Ответ №3:
MSDN: Барьер — это объект, который предотвращает продолжение выполнения отдельных задач в параллельной операции до тех пор, пока все задачи не достигнут барьера. Это полезно, когда параллельная операция выполняется поэтапно, и каждая фаза требует синхронизации между задачами.