CSingleLock简介
CSingleLock没有基类。
一个CSingleLock类对象代表一种访问控制机制,这种机制用于控制在一个多线程程序中对一个资源的访问。为了使用同步类CSemaphore,CMutex,CCriticalSection,和CEvent,你必须创建一个CSingleLock或CMultiLock对象来等待和释放这个同步对象。当你只需要每次等待一个对象时,可以使用CSingleLock。当在一个特别的时候你可以使用多个对象时,可以使用CMultiLock。
要使用一个CSingleLock对象,在被控制资源的类中的一个成员函数内部调用CSingleLock的构造函数。然后调用ISLock成员函数来确定这个资源是否可用。如果资源是可用的,则继续该成员函数的其余部分。如果资源不能使用,可以在一个指定的时间内等待资源被释放,或者是返回失败。在使用完资源后,如果CSingleLock对象要被再次使用,可以调用Unlock函数,或者销毁CSingleLock对象。
CSingleLock对象需要有一个从CSyncObject派生的对象存在。这通常是一个被控制资源的类的数据成员。
使用CSingleLock通过对互斥的控制达到共享资源的互斥访问;如果一个线程占正在访问互斥,那么系统将挂起当前的调用线程,直到这个互斥被释放为止,这时,被挂起的线程将被唤醒并取得对互斥的控制;一般来说使用锁需要Lock,Unlock两步,而使用CSingleLock时,只需要一步即可,即在函数内部,声明一个CSingleLock,同时指定互斥对象的指针,在函数执行完毕的时候,会自动执行CSingleLock的析构函数,从而解锁。
优缺点
1.防止编程时的笔误,只有Lock,没有UnLock。
2.函数异常退出时,有可能流程走不到UnLock处,会导致资源锁死,而使CSingleLock,则会在函数出栈时,自动调用CSingleLock析构函数。
3.缺点就是性能上总会有损失的,因为它多了一个构造与析构的过程,但对于普通应用来讲,优处大于缺点。
代码
class CDataArray
{
private:
int iArray[10];
CMutex Mutex;
CCriticalSection CritSection;
public:
CDataArray(){};
~CDataArray(){};
void SetData(int iValue);
void GetDataArray(int aArray[10]);
};
void CDataArray::SetData(int iValue)
{
CSingleLock SingleLock(&Mutex);//方法一
//CSingleLock SingleLock(&CritSection); 方法二
SingleLock.Lock();
if(SingleLock.IsLocked()){
for (int i=0;i<10;i++)
iArray[i]=iValue;
}
Lock.Unlock();//此步也可以进行省略
}
void CDataArray::GetDataArray(int aArray[10])
{
CSingleLock SingleLock(&Mutex);//方法一
//CSingleLock SingleLock(&CritSection); 方法二
SingleLock.Lock();
if(SingleLock.IsLocked()){
for (int i=0;i<10;i++)
aArray[i]=iArray[i];
}
Lock.Unlock();//此步也可以进行省略
}