CSingleLock
习多线程之三:线程同步--使用互斥
互斥跟临界区很相似,便远比临界区复杂。因为使用互斥不仅仅能够在同一应用程序不同线程中实现资源的安全共享,而且可以在不同应用程序的线程之间实现对资源的安全共享。通过CMutex来完成线程间的互质,即:CMutex Mutext;
从而我们可以这样来定义数据对象:
class CDataArray { private: int iArray[10]; CMutex Mutex; public: CDataArray(){}; ~CDataArray(){}; void SetData(int iValue); void GetDataArray(int aArray[10]); }; 成员函数实现如下: void CDataArray::SetData(int iValue) { CSingleLock SingleLock(&Mutex); SingleLock.Lock(); for (int i=0;i<10;i++) iArray[i]=iValue; } void CDataArray::GetDataArray(int aArray[10]) { CSingleLock SingleLock(&Mutex); SingleLock.Lock(); for (int i=0;i<10;i++) aArray[i]=iArray[i]; }
为了访问一个互斥对象,务必建立一个CSingleLock或CMultiLock对象,用于访问控制。如果互斥没有被线程占用,那么当前的调用线程可以成为互斥的占用者。要实现对互斥的访问,就要调用CSingleLock的成员函数Lock(),即:
SingleLock.Lock();
如果一个线程占用了互斥,那么系统将挂起当前的调用线程,直到这个互斥被释放为止,这时,被挂起的线程将被唤醒并取得对互斥的控制。
释放互斥是通过调用CSingleLock的成员函数UnLock()来实现的。CDataArray的成员函数在退出时,将自动进行解锁操作。因为CSingleLock被创建在椎栈上,系统自动完成对UnLock()的调用。