临界段CCriticalSection的使用

来源:互联网 发布:av淘宝最新地址获取 编辑:程序博客网 时间:2024/05/16 15:45

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

0 0