臨界段CCriticalSection的使用

CCriticalSection的對象表示一個“臨界區”,它是一個用於同步的對象,同一時刻只允許一個線程存取資源或代碼區。臨界區在控制一次只有一個線程修改數據或其它的控制資源時非常有用。例如,在鏈表中增加一個結點就只允許一次一個線程進行。通過使用CCriticalSection對象來控制鏈表,就可以達到這個目的。它就像是一把鑰匙,哪個線程獲得了它就獲得了運行線程的權力,而把其他線程統統阻塞。
CCriticalSection類的構造函數原型如下:

CCriticalSection() 

可以發現這個類的構造函數沒有參數,所以創建一個CCriticalSection類的對象非常簡單,只有如下即可:

CCriticalSection criticalSection; 

示例:使用臨界段編寫一個有兩個線程的應用程序。
1.創建單文檔應用程序;
2.在視圖類的實現文件中定義一個臨界段對象:

CCriticalSection criticalSection; 

3.在視圖類的實現文件中定義兩個線程函數:

UINT MessageThread1(LPVOID pParam) 

    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.在視圖類鼠標左鍵消息函數編寫如下:

void CThreadTestView::OnLButtonDown(UINT nFlags, CPoint point) 

    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版)》

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章