Разница между Барьером в С# 4.0 и WaitHandle в С# 3.0?

Я собираю С# 4.0 и одну из вещей, которые меня путают, является концепцией барьера.

Разве это не похоже на метод WaitAll WaitHandle? Разве это не ждет завершения всех потоков?

Я изучил конструкцию барьера с этой страницы: http://www.managed-world.com/archive/2009/02/09/an-intro-to-barrier.aspx

Однако это похоже на метод WaitAll. Что мне не хватает? Какая разница здесь?

Спасибо.

Ответ 1

Похоже, вам любопытно, почему барьер будет предпочтительнее производного WaitHandle + WaitForAll? Оба могут достичь аналогичной цели, если правильно структурированы.

Я не очень знаком с Барьером, но одно преимущество, которое выпрыгивает на меня, - проблема ресурсов. Для синхронизации потоков N с барьером требуется только один экземпляр Barrier. Для синхронизации потоков N через WaitHandle и WaitAll требуются N дескрипторов. Эти ресурсы дешевы, но не бесплатны. Сокращение количества ресурсов для синхронизации группы потоков имеет свои преимущества.

Ответ 2

См. Barrier. Он ожидает, что группа из нескольких потоков достигнет определенной точки, а не единицы. Он часто используется в научных вычислениях и симуляции для представления временных тиков.

Представьте себе 1000 x 1000 x 1000 сетки кубов, представляющих кубическую милю воздуха. При нулевом токе данный единичный куб подвергается влиянию различных параметров его соседей, таких как темп и давление. Как только каждый вычислит время 1, вы делаете то же самое для времени 2... Вы получаете симуляцию погоды. Аналогичная история для ядерного моделирования.

Также существует вариация барьера, называемая CyclicBarrier, где он принимает потоки, которые не выходили из стартовой линии и не позволяли ей присоединиться вернуться в группу через некоторое время. Из документации не ясно, является ли С# 4 Barrier циклическим барьером, но существует свойство, называемое ParticipantsRemaining.

Ответ 3

Barrier предлагает более высокий уровень абстракции и удобства: единственный вызов SignalAndWait - это все, что нужно каждому потоку, вместо того, чтобы знать, какой дескриптор в массиве он должен сигнализировать (или использовать мьютекс для поиска и увеличьте "следующее доступное пятно в массиве" и сообщите об этом), и вам нужно сначала подать сигнал, а затем WaitAll.

В конце концов вы можете выполнить одну и ту же задачу синхронизации, используя соответствующие другие механизмы синхронизации, но для такого общего шаблона использования, как Barrier, можно использовать такое удобное и надежное решение и аккуратно упакованы; -).

Ответ 4

WaitFor - это оператор Transact SQL. Он блокирует выполнение партии, хранимой процедуры или транзакции до тех пор, пока не будет достигнут определенный промежуток времени или времени, или указанный оператор не изменит или не вернет хотя бы одну строку.

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

Если вы ссылаетесь на WaitAll, WaitAll требует, чтобы вы поддерживали массив WaitHandles. В этом смысле барьер немного проще использовать. Однако я согласен, что оба метода выглядят очень похожими.

Ответ 6

Кажется, что мне посчитали waithandle. Дает вам возможность сказать "когда число потоков, ожидающих на этом замке, становится X, пусть все идет". Это ничего не может сделать с другой конструкцией, но это кажется удобным.