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_ONLYSYNCHRONIZATION_BARRIER_FLAGS_SPIN_ONLY来替代屏障的默认行为。 但是,请记住,使用这些标志可能会影响性能。 无限期旋转使处理器无法为其他线程提供服务,而过早阻塞会导致从处理器上交换线程、在线程解除阻塞时唤醒线程以及再次将其交换回处理器的开销。 一般情况下,最好允许屏障来管理线程,并且仅在性能测试表明应用程序将从这些标志中受益时才使用这些标志。

要求

要求
最低受支持的客户端 Windows 8 [仅限桌面应用]
最低受支持的服务器 Windows Server 2012 [仅限桌面应用]
目标平台 Windows
标头 synchapi.h
Library Kernel32.lib
DLL Kernel32.dll

另请参阅

DeleteSynchronizationBarrier

InitializeSynchronizationBarrier

同步障碍

VBS enclave 中可用的 Vertdll API