类CCriticalSection的对象表示一个“临界区”,它是一个用于同步的对象,同一时刻只允许一个线程存取资源或代码区。临界区在控制一次只有一个线程修改数据或其它的控制资源时非常有用。例如,在链表中增加一个结点就只允许一次一个线程进行。通过使用CCriticalSection对象来控制链表,就可以达到这个目的。它就像是一把钥匙,哪个线程获得了它就获得了运行线程的权力,而把其他线程统统阻塞。CCriticalSection类的构造函数原型如下:
CCriticalSection()
可以发现这个类的构造函数没有参数,所以创建一个CCriticalSection类的对象非常简单,只有如下即可:
CCriticalSectioncriticalSection;
示例:使用临界段编写一个有两个线程的应用程序。1.创建单文档应用程序;2.在视图类的实现文件中定义一个临界段对象:
CCriticalSectioncriticalSection;
3.在视图类的实现文件中定义两个线程函数:
UINTMessageThread1(LPVOIDpParam){criticalSection.Lock();LPTSTRpMessage=_T(“Thread1isstarted”);CWnd*pMainWnd=AfxGetMainWnd();::MessageBox(pMainWnd->m_hWnd,pMessage,_T(“Threadmessage”),MB_OK);criticalSection.Unlock();return0;}UINTMessageThread2(LPVOIDpParam){criticalSection.Lock();LPTSTRpMessage=_T(“Thread2isstarted”);CWnd*pMainWnd=AfxGetMainWnd();::MessageBox(pMainWnd->m_hWnd,pMessage,_T(“Threadmessage”),MB_OK);criticalSection.Unlock();return0;}
4.在视图类鼠标左键消息函数编写如下:
voidCThreadTestView::OnLButtonDown(UINTnFlags,CPointpoint){AfxBeginThread(MessageThread1,_T(“Threadisstarted”));//启动线程1AfxBeginThread(MessageThread2,_T(“Threadisstarted”));//启动线程2CView::OnLButtonDown(nFlags,point);}
运行结果如下:
参考资料:1.临界段类(CCriticalSection)——MFC 2.《MFC Windows应用程序设计(第2版)》
,生命不是一场赛跑,而是一次旅行。比赛在乎终点,而旅行在乎沿途风景。