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