臨界區是一種保證在某一時刻只有一個線程能訪問數據的簡便辦法。不管哪一個線程占用臨界區對象,它都可以訪問受保護的數據,而其他線程就必須等待,直到占用臨界區的線程進行釋放操作,從而臨界區的數據是不會一個以上的線程同一時刻訪問的。
在MFC中通過CCtiticalSection類來創建臨界區實例,如:CCriticalSection CriticalSection;
當線程准備訪問臨界區的數據時,必須調用它的成員函數Lock()進行鎖定,如: CriticalSecion.Lock();
如果沒有任何線程占用臨界區,Lock()可以向調用純種提供臨界區數據的訪問,當線程完成各項數據操作後,再調用成員函數UnLock()進行釋放,別的線程才可以占用臨界區。如: CriticalSection.UnLock();
可以定義一個數據實例:class CDataArray
{
private:
int iArray[10];
CCriticalSection CriticalSection;
public:
CDataArray(){};
~CDataArray(){};
void SetData(int iValue);
void GetDataArray(int aArray[10]);
};
在頭文件中必須包含afxmt.h,它提供了程序對CCriticalSection的訪問機制。void CDataArray::SetData(int iValue)
{
CriticalSection.Lock();
for (int i=0;i<10;i++)
iArray[i]=iValue;
CriticalSection.Unlock();
}
void CDataArray::GetDataArray(int aArray[10])
{
CriticalSection.Lock();
for (int i=0;i<10;i++)
aArray[i]=iArray[i];
CriticalSection.Unlock();
}
增加數據實例:CDataArray DataArray;
再編寫讀寫函數:UINT Thread_WriteProc(LPVOID param)
{
for (int i=0;i<10;i++)
{
DataArray.SetData(i);
::Sleep(500);
}
return 0;
}
UINT Thread_ReadProc(LPVOID param)
{
int aArray[10];
for (int i=0;i<20;i++)
{
DataArray.GetDataArray(aArray);
char str[255];
str[0]=0;
for (int j=0;j<10;j++)
{
int len=strlen(str);
wsprintf(&str[len],"%d",aArray[j]);
}
::MessageBox((HWND)param,str,"Thread Read Proc",MB_OK);
}
return 0;
}
這樣我們可以啟動這兩個線程函數:HWND hWnd=GetSafeHwnd();
這樣當Thread_WriteProc占用臨界區時,Thread_ReadProc必須等待,直到Thread_WriteProc退出了臨界區,從而實現線程間的同步。
AfxBeginThread(Thread_WriteProc,hWnd);
AfxBeginThread(Thread_ReadProc,hWnd);
本文即本人在學習多任務多線程過程的手記,供大家參考,望能得到各位指點。
本文配套源碼