類CCriticalSection的對象表示一個“臨界區”,它是一個用於同步的對象,同一時刻只允許一個線程存取資源或代碼區。臨界區在控制一次只有一個線程修改數據或其它的控制資源時非常有用。例如,在鏈表中增加一個結點就只允許一次一個線程進行。通過使用CCriticalSection對象來控制鏈表,就可以達到這個目的。它就像是一把鑰匙,哪個線程獲得了它就獲得了運行線程的權力,而把其他線程統統阻塞。
CCriticalSection類的構造函數原型如下:
可以發現這個類的構造函數沒有參數,所以創建一個CCriticalSection類的對象非常簡單,只有如下即可:
示例:使用臨界段編寫一個有兩個線程的應用程序。
1.創建單文檔應用程序;
2.在視圖類的實現文件中定義一個臨界段對象:
3.在視圖類的實現文件中定義兩個線程函數:
{
criticalSection.Lock();
LPTSTR pMessage = _T("Thread1 is started");
CWnd *pMainWnd = AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread message"), MB_OK);
criticalSection.Unlock();
return 0;
}
UINT MessageThread2(LPVOID pParam)
{
criticalSection.Lock();
LPTSTR pMessage = _T("Thread2 is started");
CWnd *pMainWnd = AfxGetMainWnd();
::MessageBox(pMainWnd->m_hWnd, pMessage, _T("Thread message"), MB_OK);
criticalSection.Unlock();
return 0;
}
4.在視圖類鼠標左鍵消息函數編寫如下:
{
AfxBeginThread(MessageThread1, _T("Thread is started")); //啓動線程1
AfxBeginThread(MessageThread2, _T("Thread is started")); //啓動線程2
CView::OnLButtonDown(nFlags, point);
}
運行結果如下:
參考資料:
1.臨界段類(CCriticalSection)——MFC http://blog.sina.com.cn/s/blog_627ebfc30100itd9.html
2.《MFC Windows應用程序設計(第2版)》