Поделиться через


Барьеры синхронизации

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

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

Чтобы создать барьер синхронизации, вызовите функцию InitializeSynchronizationBarrier и укажите максимальное количество потоков и количество раз, когда поток должен вращаться перед блокировкой. Затем запустите потоки, которые будут использовать барьер. После завершения работы каждый поток вызывает EnterSynchronizationBarrier , чтобы подождать у барьера. Функция EnterSynchronizationBarrier блокирует каждый поток до тех пор, пока число потоков, заблокированных в барьере, не достигнет максимального количества потоков для барьера, после чего EnterSynchronizationBarrier разблокирует все потоки. Функция EnterSynchronizationBarrier возвращает значение TRUE для одного из потоков, которые вошли в барьер, и возвращает значение FALSE для всех остальных потоков.

Чтобы снять барьер синхронизации, когда он больше не нужен, вызовите Метод DeleteSynchronizationBarrier. Эту функцию можно вызывать сразу после вызова EnterSynchronizationBarrier , так как она гарантирует, что все потоки завершали использование барьера перед освобождением.

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