首页 > 编程语言 > 详细

VC多线程临界区(转)

时间:2014-12-11 23:55:54      阅读:509      评论:0      收藏:0      [点我收藏+]
      用于理解CriticalSection。
  在使用多线程时,一般很少有多个线程完全独立的工作。往往是多个线程同时操作一个全局变量来获取程序的运行结果。多个线程同时访问同一个全局变量,如果都是读取操作,则不会出现问题。如果是写操作,则会发生错误。这时候,我们可以通过临界区,为全局变量设置一个保护,保证同时只有一个线程可以访问此变量,其他变量进入等待状态。       临界区(Critical Section)是一段独占对某些共享资源访问的代码,在任意时刻只允许一个线程对共享资源进行访问。如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。       临界区在使用时以CRITICAL_SECTION结构对象保护共享资源,并分别用 ①InitializeCriticalSection(&cs); //初始化临界区②EnterCriticalSection(&cs);//进入临界区③LeaveCriticalSection(&cs);//离开临界区④DeleteCriticalSection(&cs);//删除临界区       一般类程序(举例)
bubuko.com,布布扣
bubuko.com,布布扣// 临界区结构对象 bubuko.com,布布扣CRITICAL_SECTION g_cs; bubuko.com,布布扣// 共享资源 bubuko.com,布布扣char g_cArray[10] bubuko.com,布布扣 bubuko.com,布布扣UINT ThreadProc1(LPVOID pParam) bubuko.com,布布扣bubuko.com,布布扣{ bubuko.com,布布扣 // 进入临界区 bubuko.com,布布扣 EnterCriticalSection(&g_cs); bubuko.com,布布扣 // 对共享资源进行写入操作 bubuko.com,布布扣 for (int i = 0; i < 10; i++) bubuko.com,布布扣 bubuko.com,布布扣{ bubuko.com,布布扣  g_cArray[i] = ’a’; bubuko.com,布布扣  Sleep(1); bubuko.com,布布扣 } bubuko.com,布布扣 // 离开临界区 bubuko.com,布布扣 LeaveCriticalSection(&g_cs); bubuko.com,布布扣 return 0; bubuko.com,布布扣} bubuko.com,布布扣 bubuko.com,布布扣UINT ThreadProc2(LPVOID pParam) bubuko.com,布布扣bubuko.com,布布扣{ bubuko.com,布布扣 // 进入临界区 bubuko.com,布布扣 EnterCriticalSection(&g_cs); bubuko.com,布布扣 // 对共享资源进行写入操作 bubuko.com,布布扣 for (int i = 0; i < 10; i++) bubuko.com,布布扣 bubuko.com,布布扣{ bubuko.com,布布扣  g_cArray[10 - i - 1] = ’b’; bubuko.com,布布扣  Sleep(1); bubuko.com,布布扣 } bubuko.com,布布扣 // 离开临界区 bubuko.com,布布扣 LeaveCriticalSection(&g_cs); bubuko.com,布布扣 return 0; bubuko.com,布布扣} bubuko.com,布布扣 bubuko.com,布布扣void CSampleView::OnCriticalSection() bubuko.com,布布扣bubuko.com,布布扣{ bubuko.com,布布扣 // 初始化临界区 bubuko.com,布布扣 InitializeCriticalSection(&g_cs); bubuko.com,布布扣 // 启动线程 bubuko.com,布布扣 AfxBeginThread(ThreadProc1, NULL); bubuko.com,布布扣 AfxBeginThread(ThreadProc2, NULL); bubuko.com,布布扣 // 等待计算完毕 bubuko.com,布布扣 Sleep(300); bubuko.com,布布扣 // 报告计算结果 bubuko.com,布布扣 CString sResult = CString(g_cArray); bubuko.com,布布扣 AfxMessageBox(sResult); bubuko.com,布布扣}
bubuko.com,布布扣
      在使用临界区时,一般不允许其运行时间过长,只要进入临界区的线程还没有离开,其他所有试图进入此临界区的线程都会被挂起而进入到等待状态,并会在一定程度上影响。程序的运行性能。尤其需要注意的是不要将等待用户输入或是其他一些外界干预的操作包含到临界区。如果进入了临界区却一直没有释放,同样也会引起其他线程的长时间等待。换句话说,在执行了EnterCriticalSection()语句进入临界区后无论发生什么,必须确保与之匹配的LeaveCriticalSection()都能够被执行到。可以通过添加结构化异常处理代码来确保LeaveCriticalSection ()语句的执行。虽然临界区同步速度很快,但却只能用来同步本进程内的线程,而不可用来同步多个进程中的线程。      

      MFC为临界区提供有一个CCriticalSection类,使用该类进行线程同步处理是非常简单的,只需在线程函数中用CCriticalSection类成员函数 Lock()和UnLock()标定出被保护代码片段即可。对于上述代码,可通过CCriticalSection类将其改写如下:

       MFC应用(举例)

bubuko.com,布布扣
bubuko.com,布布扣// MFC临界区类对象 bubuko.com,布布扣CCriticalSection g_cs; bubuko.com,布布扣// 共享资源 bubuko.com,布布扣char g_cArray[10]; bubuko.com,布布扣UINT ThreadProc1(LPVOID pParam) bubuko.com,布布扣bubuko.com,布布扣{ bubuko.com,布布扣 // 进入临界区 bubuko.com,布布扣 g_cs.Lock(); bubuko.com,布布扣 // 对共享资源进行写入操作 bubuko.com,布布扣 for (int i = 0; i < 10; i++) bubuko.com,布布扣 bubuko.com,布布扣{ bubuko.com,布布扣  g_cArray[i] = ’a’; bubuko.com,布布扣  Sleep(1); bubuko.com,布布扣 } bubuko.com,布布扣 // 离开临界区 bubuko.com,布布扣 g_cs.Unlock(); bubuko.com,布布扣 return 0; bubuko.com,布布扣} bubuko.com,布布扣UINT ThreadProc2(LPVOID pParam) bubuko.com,布布扣bubuko.com,布布扣{ bubuko.com,布布扣 // 进入临界区 bubuko.com,布布扣 g_cs.Lock(); bubuko.com,布布扣 // 对共享资源进行写入操作 bubuko.com,布布扣 for (int i = 0; i < 10; i++) bubuko.com,布布扣 bubuko.com,布布扣{ bubuko.com,布布扣  g_cArray[10 - i - 1] = ’b’; bubuko.com,布布扣  Sleep(1); bubuko.com,布布扣 } bubuko.com,布布扣 // 离开临界区 bubuko.com,布布扣 g_cs.Unlock(); bubuko.com,布布扣 return 0; bubuko.com,布布扣} bubuko.com,布布扣void CSampleView::OnCriticalSectionMfc() bubuko.com,布布扣bubuko.com,布布扣{ bubuko.com,布布扣 // 启动线程 bubuko.com,布布扣 AfxBeginThread(ThreadProc1, NULL); bubuko.com,布布扣 AfxBeginThread(ThreadProc2, NULL); bubuko.com,布布扣 // 等待计算完毕 bubuko.com,布布扣 Sleep(300); bubuko.com,布布扣 // 报告计算结果 bubuko.com,布布扣 CString sResult = CString(g_cArray); bubuko.com,布布扣 AfxMessageBox(sResult); bubuko.com,布布扣}
bubuko.com,布布扣

转自:http://www.cnblogs.com/userinterface/archive/2005/04/27/146137.html

VC多线程临界区(转)

原文:http://www.cnblogs.com/760044827qq/p/4158640.html

(1)
(1)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!