用户模式下的线程同步

来源:互联网 发布:网络继电器是什么 编辑:程序博客网 时间:2024/05/16 18:22

用户模式下的线程同步主要在于不会进入等待状态(有时也会进入等待状态,像关键段和slim读写锁,但是可以设置“忙等”的时间)。但是,由于使用它们的时候只是像声明全局变量那样,它们只能在进程内同步,不能在进程之间做同步。

包括如下4中用户模式下的同步机制。

1. Interlocked系列函数,比如InterlockedExchangeAdd64,会以原子访问方式完成将一个数加上另一个数的操作。这些函数作用太小了,用的少。

2. 关键段,也即操作系统课上讲的临界区,CritcalSection。书上有一个卫生间的比喻,非常形象。使用时临界区时主要涉及五个函数:InitializeCriticalSection用于初始化、EnterCriticalSection进入临界区、TryEnterCriticalSection用于尝试进入临界区而不等待、LeaveCriticalSection用于离开临界区、DeleteCriticalSection用于清理。使用临界区时可以设置进入等待状态之前的“忙等”时间,只要使用InitializeCriticalSectionAndSpinCount来代替InitializeCriticalSection做初始化。临界区可以被多次锁定。

3. Slim读写锁SRWLock,分为用于写者的排他锁和用于读者的共享锁。也涉及几个函数,基本原理和CriticalSection差不多。但是SRWLock不能多次被锁定,也没哟Try*的尝试进入函数。

4. 条件变量CONDITION_VARIABLE,可以配合上述两种锁使用。条件变量的主要作用是让线程把锁释放并将自己阻塞,直到一个条件成立位置。当然,前提是要先占有锁。连个函数:SleepConditionVariableCS和SleepConditionVariableSRW,分别对应关键段和Slim读写锁。比如另一个线程想宣布条件满足了,可以调用WakeConditionVariable和WakeAllConditionVariable函数。这样之前阻塞的线程就被转为可调度状态。