同步障碍
同步屏障允许多个线程等待所有线程都到达特定执行点,然后任何线程才会继续。 无法跨进程共享同步屏障。
同步屏障适用于分阶段计算,其中并行执行相同代码的线程必须全部完成一个阶段,然后再转到下一个阶段。
若要创建同步屏障,请调用 InitializeSynchronizationBarrier 函数并指定最大线程数以及线程在阻止之前应旋转的次数。 然后启动将使用该屏障的线程。 每个线程完成其工作后,它会调用 EnterSynchronizationBarrier 来等待屏障。 EnterSynchronizationBarrier 函数会阻止每个线程,直到屏障中阻塞的线程数达到屏障的最大线程计数,此时 EnterSynchronizationBarrier 将取消阻止所有线程。 EnterSynchronizationBarrier 函数为进入屏障的线程之一返回 TRUE,并为所有其他线程返回 FALSE。
若要在不再需要同步屏障时释放同步屏障,请调用 DeleteSynchronizationBarrier。 在调用 EnterSynchronizationBarrier 后立即调用此函数是安全的,因为该函数可确保所有线程在释放屏障之前都已完成使用该屏障。
如果永远不会删除同步屏障,则线程可以在进入屏障时指定 SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE 标志。 使用屏障的所有线程都必须指定此标志;如果任何线程不这样做,则忽略 标志。 此标志会导致函数跳过删除安全性所需的额外工作,这可以提高性能。 请注意,在此标志生效时删除屏障可能会导致无效的句柄访问和一个或多个永久阻塞的线程。