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


Функция EnterSynchronizationBarrier (synchapi.h)

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

Синтаксис

BOOL EnterSynchronizationBarrier(
  [in, out] LPSYNCHRONIZATION_BARRIER lpBarrier,
  [in]      DWORD                     dwFlags
);

Параметры

[in, out] lpBarrier

Указатель на инициализированный барьер синхронизации. Используйте функцию InitializeSynchronizationBarrier для инициализации барьера. SYNCHRONIZATION_BARRIER — это непрозрачная структура, которую приложение не должно изменять.

[in] dwFlags

Флаги, управляющие поведением потоков, которые входят в этот барьер. Этот параметр может иметь одно или несколько из следующих значений:

Значение Значение
SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY Указывает, что поток, входящий в барьер, должен блокироваться немедленно, пока последний поток не войдет в барьер. Дополнительные сведения см. в подразделе "Примечания".
SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY Указывает, что поток, входящий в барьер, должен вращаться до тех пор, пока последний поток не войдет в барьер, даже если вращающееся поток превышает максимальное число спинов барьера. Дополнительные сведения см. в подразделе "Примечания".
SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE Указывает, что функция может пропустить работу, необходимую для безопасного удаления барьера, что может повысить производительность. Все потоки, которые входят в этот барьер, должны указывать флаг ; В противном случае флаг игнорируется. Этот флаг следует использовать только в том случае, если барьер никогда не будет удален.

Возвращаемое значение

TRUE для последнего потока, сигнального барьеру. Потоки, которые сигнализируют о барьере до того, как последний поток сообщает о получении возвращаемого FALSEзначения .

Комментарии

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

Поток может переопределить поведение барьера по умолчанию, указав SYNCHRONIZATION_BARRIER_FLAGS_BLOCK_ONLY или SYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY. Однако помните, что использование этих флагов может повлиять на производительность. Вращение на неопределенный срок не позволяет процессору обслуживать другие потоки, в то время как преждевременная блокировка влечет за собой дополнительные расходы на переключение потока с процессора, пробуждение потока при разблокировке и его повторное переключение на процессор. Как правило, лучше разрешить барьер для управления потоками и использовать эти флаги только в том случае, если тестирование производительности показывает, что приложение выиграет от них.

Требования

Требование Значение
Минимальная версия клиента Windows 8 [только классические приложения]
Минимальная версия сервера Windows Server 2012 [только классические приложения]
Целевая платформа Windows
Header synchapi.h
Библиотека Kernel32.lib
DLL Kernel32.dll

См. также

DeleteSynchronizationBarrier

InitializeSynchronizationBarrier

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

API-интерфейсы Vertdll, доступные в анклавах VBS