临界段CCriticalSection的使用

Posted sjwics

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了临界段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版)》

再分享一下我老师大神的人工智能教程吧。零基础!通俗易懂!风趣幽默!还带黄段子!希望你也加入到我们人工智能的队伍中来!http://www.captainbed.net

以上是关于临界段CCriticalSection的使用的主要内容,如果未能解决你的问题,请参考以下文章

c++多线程问题

线程同步的几种方式

在非 C++ 异常的情况下解锁临界区

使用CCriticalSection类的注意事项

002_FreeRTOS临界段代码

进程通信+线程同步