日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

秒杀多线程第七篇 经典线程同步 互斥量Mutex

發布時間:2024/4/11 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 秒杀多线程第七篇 经典线程同步 互斥量Mutex 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

閱讀本篇之前推薦閱讀以下姊妹篇:

秒殺多線程第四篇一個經典的多線程同步問題

秒殺多線程第五篇經典線程同步關鍵段CS

秒殺多線程第六篇經典線程同步事件Event

?

前面介紹了關鍵段CS、事件Event經典線程同步問題中的使用。本篇介紹用互斥量Mutex來解決這個問題。

互斥量也是一個內核對象,它用來確保一個線程獨占一個資源的訪問?;コ饬颗c關鍵段的行為非常相似,并且互斥量可以用于不同進程中的線程互斥訪問資源。使用互斥量Mutex主要將用到四個函數。下面是這些函數的原型和使用說明。

第一個?CreateMutex

函數功能:創建互斥量(注意與事件Event的創建函數對比)

函數原型:

HANDLECreateMutex(

??LPSECURITY_ATTRIBUTESlpMutexAttributes,

??BOOLbInitialOwner,?????

??LPCTSTRlpName

);

函數說明:

第一個參數表示安全控制,一般直接傳入NULL

第二個參數用來確定互斥量的初始擁有者。如果傳入TRUE表示互斥量對象內部會記錄創建它的線程的線程ID號并將遞歸計數設置為1,由于該線程ID非零,所以互斥量處于未觸發狀態。如果傳入FALSE,那么互斥量對象內部的線程ID號將設置為NULL,遞歸計數設置為0,這意味互斥量不為任何線程占用,處于觸發狀態。

第三個參數用來設置互斥量的名稱,在多個進程中的線程就是通過名稱來確保它們訪問的是同一個互斥量。

函數訪問值:

成功返回一個表示互斥量的句柄,失敗返回NULL。

?

第二個打開互斥量

函數原型:

HANDLEOpenMutex(

?DWORDdwDesiredAccess,

?BOOLbInheritHandle,

?LPCTSTRlpName?????//名稱

);

函數說明:

第一個參數表示訪問權限,對互斥量一般傳入MUTEX_ALL_ACCESS。詳細解釋可以查看MSDN文檔。

第二個參數表示互斥量句柄繼承性,一般傳入TRUE即可。

第三個參數表示名稱。某一個進程中的線程創建互斥量后,其它進程中的線程就可以通過這個函數來找到這個互斥量。

函數訪問值:

成功返回一個表示互斥量的句柄,失敗返回NULL

?

第三個觸發互斥量

函數原型:

BOOLReleaseMutex?(HANDLEhMutex)

函數說明:

訪問互斥資源前應該要調用等待函數,結束訪問時就要調用ReleaseMutex()來表示自己已經結束訪問,其它線程可以開始訪問了。

?

最后一個清理互斥量

由于互斥量是內核對象,因此使用CloseHandle()就可以(這一點所有內核對象都一樣)。

?

接下來我們就在經典多線程問題用互斥量來保證主線程與子線程之間的同步,由于互斥量的使用函數類似于事件Event,所以可以仿照上一篇的實現來寫出代碼

[cpp]?view plaincopy
  • //經典線程同步問題?互斥量Mutex??
  • #include?<stdio.h>??
  • #include?<process.h>??
  • #include?<windows.h>??
  • ??
  • long?g_nNum;??
  • unsigned?int?__stdcall?Fun(void?*pPM);??
  • const?int?THREAD_NUM?=?10;??
  • //互斥量與關鍵段??
  • HANDLE??g_hThreadParameter;??
  • CRITICAL_SECTION?g_csThreadCode;??
  • ??
  • int?main()??
  • {??
  • ????printf("?????經典線程同步?互斥量Mutex\n");??
  • ????printf("?--?by?MoreWindows(?http://blog.csdn.net/MoreWindows?)?--\n\n");??
  • ??????
  • ????//初始化互斥量與關鍵段?第二個參數為TRUE表示互斥量為創建線程所有??
  • ????g_hThreadParameter?=?CreateMutex(NULL,?FALSE,?NULL);??
  • ????InitializeCriticalSection(&g_csThreadCode);??
  • ??
  • ????HANDLE??handle[THREAD_NUM];???
  • ????g_nNum?=?0;???
  • ????int?i?=?0;??
  • ????while?(i?<?THREAD_NUM)???
  • ????{??
  • ????????handle[i]?=?(HANDLE)_beginthreadex(NULL,?0,?Fun,?&i,?0,?NULL);??
  • ????????WaitForSingleObject(g_hThreadParameter,?INFINITE);?//等待互斥量被觸發??
  • ????????i++;??
  • ????}??
  • ????WaitForMultipleObjects(THREAD_NUM,?handle,?TRUE,?INFINITE);??
  • ??????
  • ????//銷毀互斥量和關鍵段??
  • ????CloseHandle(g_hThreadParameter);??
  • ????DeleteCriticalSection(&g_csThreadCode);??
  • ????for?(i?=?0;?i?<?THREAD_NUM;?i++)??
  • ????????CloseHandle(handle[i]);??
  • ????return?0;??
  • }??
  • unsigned?int?__stdcall?Fun(void?*pPM)??
  • {??
  • ????int?nThreadNum?=?*(int?*)pPM;??
  • ????ReleaseMutex(g_hThreadParameter);//觸發互斥量??
  • ??????
  • ????Sleep(50);//some?work?should?to?do??
  • ??
  • ????EnterCriticalSection(&g_csThreadCode);??
  • ????g_nNum++;??
  • ????Sleep(0);//some?work?should?to?do??
  • ????printf("線程編號為%d??全局資源值為%d\n",?nThreadNum,?g_nNum);??
  • ????LeaveCriticalSection(&g_csThreadCode);??
  • ????return?0;??
  • }??
  • 運行結果如下圖:

    可以看出,與關鍵段類似,互斥量也是不能解決線程間的同步問題。

    ???????聯想到關鍵段會記錄線程ID即有“線程擁有權”的,而互斥量也記錄線程ID,莫非它也有“線程擁有權”這一說法。

    ???????答案確實如此,互斥量也是有“線程擁有權”概念的?!熬€程擁有權”在關鍵段中有詳細的說明,這里就不再贅述了。另外由于互斥量常用于多進程之間的線程互斥,所以它比關鍵段還多一個很有用的特性——“遺棄”情況的處理。比如有一個占用互斥量的線程在調用ReleaseMutex()觸發互斥量前就意外終止了(相當于該互斥量被“遺棄”了),那么所有等待這個互斥量的線程是否會由于該互斥量無法被觸發而陷入一個無窮的等待過程中了?這顯然不合理。因為占用某個互斥量的線程既然終止了那足以證明它不再使用被該互斥量保護的資源,所以這些資源完全并且應當被其它線程來使用。因此在這種“遺棄”情況下,系統自動把該互斥量內部的線程ID設置為0,并將它的遞歸計數器復置為0,表示這個互斥量被觸發了。然后系統將公平地選定一個等待線程來完成調度(被選中的線程的WaitForSingleObject()會返回WAIT_ABANDONED_0)。

    ?

    下面寫二個程序來驗證下:

    第一個程序創建互斥量并等待用戶輸入后就觸發互斥量。第二個程序先打開互斥量,成功后就等待并根據等待結果作相應的輸出。詳見代碼:

    第一個程序:

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • #include?<conio.h>??
  • #include?<windows.h>??
  • const?char?MUTEX_NAME[]?=?"Mutex_MoreWindows";??
  • int?main()??
  • {??
  • ????HANDLE?hMutex?=?CreateMutex(NULL,?TRUE,?MUTEX_NAME);?//創建互斥量??
  • ????printf("互斥量已經創建,現在按任意鍵觸發互斥量\n");??
  • ????getch();??
  • ????//exit(0);??
  • ????ReleaseMutex(hMutex);??
  • ????printf("互斥量已經觸發\n");??
  • ????CloseHandle(hMutex);??
  • ????return?0;??
  • }??
  • 第二個程序:

    [cpp]?view plaincopy
  • #include?<stdio.h>??
  • #include?<windows.h>??
  • const?char?MUTEX_NAME[]?=?"Mutex_MoreWindows";??
  • int?main()??
  • {??
  • ????HANDLE?hMutex?=?OpenMutex(MUTEX_ALL_ACCESS,?TRUE,?MUTEX_NAME);?//打開互斥量??
  • ????if?(hMutex?==?NULL)??
  • ????{??
  • ????????printf("打開互斥量失敗\n");??
  • ????????return?0;??
  • ????}??
  • ????printf("等待中....\n");??
  • ????DWORD?dwResult?=?WaitForSingleObject(hMutex,?20?*?1000);?//等待互斥量被觸發??
  • ????switch?(dwResult)??
  • ????{??
  • ????case?WAIT_ABANDONED:??
  • ????????printf("擁有互斥量的進程意外終止\n");??
  • ????????break;??
  • ??
  • ????case?WAIT_OBJECT_0:??
  • ????????printf("已經收到信號\n");??
  • ????????break;??
  • ??
  • ????case?WAIT_TIMEOUT:??
  • ????????printf("信號未在規定的時間內送到\n");??
  • ????????break;??
  • ????}??
  • ????CloseHandle(hMutex);??
  • ????return?0;??
  • }??
  • 運用這二個程序時要先啟動程序一再啟動程序二。下面展示部分輸出結果:

    結果一.二個進程順利執行完畢:

    結果二.將程序一中//exit(0);前面的注釋符號去掉,這樣程序一在觸發互斥量之前就會因為執行exit(0);語句而且退出,程序二會收到WAIT_ABANDONED消息并輸出“擁有互斥量的進程意外終止”:

    有這個對“遺棄”問題的處理,在多進程中的線程同步也可以放心的使用互斥量。

    ?

    最后總結下互斥量Mutex

    1.互斥量是內核對象,它與關鍵段都有“線程所有權”所以不能用于線程的同步。

    2.互斥量能夠用于多個進程之間線程互斥問題,并且能完美的解決某進程意外終止所造成的“遺棄”問題。

    ?

    下一篇《秒殺多線程第八篇 經典線程同步 信號量Semaphore》將介紹使用信號量Semaphore來解決這個經典線程同步問題。

    ?

    ?

    轉載請標明出處,原文地址:http://blog.csdn.net/morewindows/article/details/7470936

    如果覺得本文對您有幫助,請點擊支持一下,您的支持是我寫作最大的動力,謝謝。

    總結

    以上是生活随笔為你收集整理的秒杀多线程第七篇 经典线程同步 互斥量Mutex的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

    主站蜘蛛池模板: 黄a在线观看| 在线se| 欧美在线视频免费播放 | 黄色小网站在线观看 | 已满十八岁免费观看全集动漫 | 一个色综合久久 | 青青草综合在线 | 日韩成人短视频 | 精品国产伦一区 | 99精品久久久久久 | 精彩毛片 | 日本大胆裸体做爰视频 | 国产高清一 | jzjzz成人免费视频 | 深夜福利在线播放 | 国模大胆一区二区三区 | 黄色成年人视频 | 亚洲精品国偷拍自产在线观看蜜桃 | 新91在线| 亚洲情se | 天堂a√在线 | 亚洲最大成人综合网 | 国产老妇视频 | 2019国产在线 | 一区二区三区日韩视频 | 精品在线视频免费 | 婷婷视频一区二区三区 | 日本在线h | 国产精品国产三级国产专区53 | 亚洲欧美国产高清va在线播放 | 都市豪门艳霸淫美妇 | 豆花免费跳转入口官网 | 99视频99 | 97免费在线观看视频 | 相亲对象是问题学生在线观看 | 四虎在线免费观看 | 国内精品久久久久 | 在线观看无码精品 | 亚洲一区二区三区高清 | 日韩色综合 | 欧美一级欧美三级 | 日本免费一区二区三区四区五六区 | 国产经典久久 | 天天干天天爽 | 日韩免费av网站 | 精品国产一区二区三区四 | 公侵犯人妻中文字慕一区二区 | 久久av无码精品人妻出轨 | 91成人久久| 日韩一区二区三区网站 | 伊人久久综合影院 | 欧美一级特黄aaaaaa大片在线观看 | 久久精品无码一区二区三区 | 中文字幕亚洲乱码熟女1区2区 | 国产女厕一区二区三区在线视 | 亚洲天天做 | 无码精品在线视频 | 国产精品一区二区电影 | 秋霞在线视频 | 伊人视频在线观看 | 欧美性猛交aaaa片黑人 | 噜噜吧噜噜色 | 免看黄大片aa | 丰满岳乱妇在线观看中字无码 | 久草综合在线观看 | 少妇免费毛片久久久久久久久 | 免费在线一区二区 | 一本久道在线 | 午夜啪啪福利 | 成人毛片网 | 91精品导航 | 国产精品高潮呻吟久久 | 天天操天天插 | 欧美成人精品一区二区综合免费 | 久久夜色精品国产欧美乱极品 | 中日韩在线视频 | 桃花岛影院 | 国产精品8888| yes4444视频在线观看 | 嫩草影院菊竹影院 | 男女视频久久 | 992在线观看 | 他揉捏她两乳不停呻吟动态图 | 欧美一区,二区 | 波多野吉衣一二三区乱码 | 俄罗斯美女一级爱片 | 夜夜嗨aⅴ一区二区三区 | 夜夜嗨aⅴ一区二区三区 | 夜夜激情 | 欧美jizzhd欧美18 | 国产综合免费视频 | 中文字幕永久在线 | 娇小的粉嫩xxx极品 国产精品人人爽人人爽 | 一本色道久久综合亚洲精品按摩 | 国产国产精品 | 污污在线看| 欧美高清性 | 91精产国品一二三 | 东京av在线|