互斥跟臨界區很相似,便遠比臨界區復雜。因為使用互斥不僅僅能夠在同一應用程序不同線程中實現資源的安全共享,而且可以在不同應用程序的線程之間實現對資源的安全共享。通過CMutex來完成線程間的互質,即:CMutex Mutext;
從而我們可以這樣來定義數據對象:
#include "afxmt.h"
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()的調用。
本文即本人在學習多任務多線程過程的手記,供大家參考,望能得到各位指點。
本文配套源碼