Windows 同步技术-计时器队列和内存屏障
计时器队列
CreateTimerQueue 函数为计时器创建队列。 此队列中的计时器(称为 计时器队列计时器)是轻量级对象,可用于指定要在指定到期时间到达时调用的回调函数。 等待作由 线程池中的线程执行。
若要将计时器添加到队列,请调用 CreateTimerQueueTimer 函数。 若要更新计时器队列计时器,请调用 ChangeTimerQueueTimer 函数。 可以指定要在计时器过期时由线程池中的工作线程执行的回调函数。
若要取消挂起的计时器,请调用 DeleteTimerQueueTimer 函数。 完成计时器队列后,调用 DeleteTimerQueueEx 函数以删除计时器队列。 队列中所有挂起的计时器将被取消并删除。
同步屏障
同步屏障使多个线程可以等待,直到所有线程都到达特定执行点,然后再继续任何线程。 无法跨进程共享同步屏障。
同步屏障对于分阶段计算非常有用,其中并行执行相同代码的线程必须在继续下一个阶段之前完成一个阶段。
若要创建同步屏障,请调用 InitializeSynchronizationBarrier 函数,并指定线程在阻止之前应旋转的最大线程数以及线程的旋转次数。 然后启动将使用屏障的线程。 每个线程完成其工作后,它会调用 EnterSynchronizationBarrier 等待屏障。 EnterSynchronizationBarrier 函数会阻止每个线程,直到屏障中阻塞的线程数达到屏障的最大线程计数,此时 EnterSynchronizationBarrier 取消阻止所有线程。 EnterSynchronizationBarrier 函数针对进入屏障的线程之一返回 TRUE,并为所有其他线程返回 FALSE。
若要在不再需要同步屏障时释放同步屏障,请调用 DeleteSynchronizationBarrier。 调用 EnterSynchronizationBarrier 后立即调用此函数是安全的,因为该函数可确保所有线程在释放前都使用屏障完成。
如果永远不会删除同步屏障,则线程可以在进入屏障时指定 SYNCHRONIZATION_BARRIER_FLAGS_NO_DELETE 标志。 使用屏障的所有线程都必须指定此标志;如果没有任何线程,则忽略该标志。 此标志会导致函数跳过删除安全性所需的额外工作,从而提高性能。 请注意,当此标志生效时删除屏障可能会导致句柄访问无效,以及一个或多个永久阻止的线程。