非主流时期的歌曲:Windows核心编程(第五版)笔记 第八章 用户模式下的线程同步(Thread Sync...
第八章 用户模式下线程同步
以下线程同步方法仅限于同一进程内的不同线程。不适用于不同进程的不线程。
1.原子访问 Atomic Access
InterlockedExchange系列函数是针对于某个单一变量进行的原子操作
Volatile关键字告诉编译器不要对变量的访问做任何优化,每次读访变量的值都要去内存中读而不是在寄存器中读。
2.临界区 使一组操作原子化。
临界区对象用法:InitializeCriticalSection、(TryEnterCriticalSection ),EnterCriticalSection、LeaveCriticalSection、DeleteCriticalSection
EnterCriticalSection
线程进入临界区后 若其它线程试图想进入该临界区线程会处于阻塞(Wait)状态,使它们不占用任何CPU.
3.读写锁
允许多个读线程同时读取共享数据,但在同一时间只允许一个写线程修改共享数据。
用法:
InitializeSRWLock
写者:
AcquireSRWLockExclusive、ReleaseSRWLockExclusive
读者:
AcquireSRWLockShared、ReleaseSRWLockShared
我们并不需要销毁读写锁对象,因为系统自动处理读写锁对象。
读写锁的效率比临界区要高到少一倍左右。
4.效率
To summarize, if you want to get the best performance in an application,
you should try to use nonshared data first and then use volatile reads, volatile writes, interlocked APIs, SRWLocks, critical sections.
And if all of these won't work for your situation, then and only then, use kernel objects
5.条件变量
条件变量要与临界区对象或读写锁对象一起使用。
SleepConditionVariableCS、SleepConditionVariableSRW
WakeConditionVariable、WakeAllConditionVariable
6.Common API
InterlockedExchangeAdd InterlockedExchangeAdd64
InterlockedExchange InterlockedExchangePointer
InterlockedBitTestAndReset