使用 Win32提供的临界区可以方便的实现线程锁: // 全局: CRITICAL_SECTION cs; InitializeCriticalSection( & cs); // 线程 1: EnterCriticalSection( & cs); int a = s
a; int b = s
b; LeaveCriticalSection( & cs); // 线程 2: EnterCriticalSection( & cs); s
a ++ ; s
b -- ; LeaveCriticalSection( & cs); // 最后: DeleteCriticalSection( & cs); 代码中的临界区变量(cs)就可以看作是变量 s的锁,当函数EnterCriticalSection返回时,当前线程就获得了这把锁,之后就是对变量的访问了
访问完成后,调用 LeaveCriticalSection表示释放这把锁,允许其他线程继续使用它
如果每当需要对一个变量进行加锁时都需要做这些操作,显得有些麻烦,而且变量 cs与 s只有逻辑上的锁关系,在语法上没有什么联系,这对于锁的管理带来了不小的麻烦
程序员总是最懒的,可以想出各种偷懒的办法来解决问题,例如让被锁的变量与加锁的变量形成物理上的联系,使得锁变量成为被锁变量不可分割的一部分,这听起来是个好主意
首先想到的是把锁封闭在一个类里,让类的构造函数和析构函数来管理对锁的初始化和锁毁动作,我们称这个锁为“实例锁”: class InstanceLockBase
{ CRITICAL_SECTION cs; protected : InstanceLockBase()
{ InitialCriticalSection( & cs); } ~ InstanceLockBase()
{ DeleteC