lgxqf  

第八章 用户模式下线程同步

 

              以下线程同步方法仅限于同一进程内的不同线程。不适用于不同进程的不线程。

1.原子访问 Atomic Access 

              InterlockedExchange系列函数是针对于某个单一变量进行的原子操作         

              Volatile关键字告诉编译器不要对变量的访问做任何优化,每次读访变量的值都要去内存中读而不是在寄存器中读。         

2.临界区 使一组操作原子化。

              临界区对象用法:InitializeCriticalSection(TryEnterCriticalSection ),EnterCriticalSectionLeaveCriticalSectionDeleteCriticalSection

             

              EnterCriticalSection

                              线程进入临界区后 若其它线程试图想进入该临界区线程会处于阻塞(Wait)状态,使它们不占用任何CPU.           

3.读写锁

              允许多个读线程同时读取共享数据,但在同一时间只允许一个写线程修改共享数据。

             

              用法:

                              InitializeSRWLock

                             

                              写者:

                                              AcquireSRWLockExclusiveReleaseSRWLockExclusive

                              读者:

                                              AcquireSRWLockSharedReleaseSRWLockShared

                                             

                              我们并不需要销毁读写锁对象,因为系统自动处理读写锁对象。

             

              读写锁的效率比临界区要高到少一倍左右。

             

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.条件变量

              条件变量要与临界区对象或读写锁对象一起使用。

              SleepConditionVariableCSSleepConditionVariableSRW

              WakeConditionVariableWakeAllConditionVariable           

             

6.Common API

              InterlockedExchangeAdd        InterlockedExchangeAdd64

              InterlockedExchange              InterlockedExchangePointer

             InterlockedBitTestAndReset

posted on 2009-02-16 10:28  Justin_Ma  阅读(400)  评论(0)    收藏  举报