亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

刪除其中的一句ReleaseMutex,但發現這樣做會導致互斥體不能被正常釋放。請問這是怎么回事?

刪除其中的一句ReleaseMutex,但發現這樣做會導致互斥體不能被正常釋放。請問這是怎么回事?

C++
慕尼黑5688855 2023-03-02 14:10:57
先上代碼吧://這是2個線程模擬賣火車票的小程序#include <windows.h>#include <iostream>#include <tchar.h>using namespace std;DWORD WINAPI Fun1Proc(LPVOID lpParameter);//thread dataDWORD WINAPI Fun2Proc(LPVOID lpParameter);//thread dataint index=0;int tickets=10;HANDLE hMutex;void main(){HANDLE hThread1;HANDLE hThread2;//創建線程hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);//創建互斥對象hMutex=CreateMutex(NULL,TRUE,_T("tickets"));//創建互斥體 一次運行一個線程if (hMutex){if (ERROR_ALREADY_EXISTS==GetLastError()){cout<<"only one instance can run!"<<endl;return;}}WaitForSingleObject(hMutex,INFINITE);//等待進入互斥體 INFINITE -1ReleaseMutex(hMutex);ReleaseMutex(hMutex);Sleep(3000);}//線程1的入口函數DWORD WINAPI Fun1Proc(LPVOID lpParameter)//thread data{while (true){ReleaseMutex(hMutex);WaitForSingleObject(hMutex,INFINITE);if (tickets>0){Sleep(500);cout<<"thread1 sell ticket :"<<tickets--<<endl;}elsebreak;ReleaseMutex(hMutex);}return 0;}//線程2的入口函數DWORD WINAPI Fun2Proc(LPVOID lpParameter)//thread data{while (true){ReleaseMutex(hMutex);WaitForSingleObject(hMutex,INFINITE);if (tickets>0){Sleep(500);cout<<"thread2 sell ticket :"<<tickets--<<endl;}elsebreak;ReleaseMutex(hMutex);}return 0;}在上面的代碼是一個多線程的模型,但這個模型中有一個很有趣的地方:原始作者用WaitForSingleObject(hMutex,INFINITE);語句來獲得互斥體,同時用ReleaseMutex(hMutex);語句來釋放互斥體,但仔細看代碼卻可以發現,每一個WaitForSingleObject其實是對應了兩句一摸一樣的釋放語句,看上去好像是每獲得一次互斥體就要釋放兩遍一樣。
查看完整描述

1 回答

?
holdtom

TA貢獻1805條經驗 獲得超10個贊

一個線程可以重復占有mutex, 占有幾次資源, 就要釋放幾次資源, 不然別的線程沒法獲得mutex
main()線程在CreateMutex(TRUE)的時候已經占用資源, 在WaitForSingleObject( hMutex )再次占用, 他需要釋放兩次

同樣的道理.
別問我你程序的邏輯, 我不懂
 
剛啟動時, hMutex還沒被創建, 所以hMutex = 0 ;
DWORD WINAPI Fun1Proc(LPVOID lpParameter)//thread data
{
while (true)
{
ReleaseMutex(hMutex); // hMutex = 0 ,未定義行為
WaitForSingleObject(hMutex,INFINITE); // hMutex = 0 , 未定義
 
這程序依賴于API的失敗語義成為其邏輯一部分, 所以閱讀的人會很困難
ReleaseMutex( 0 )失敗返回
WaitForSingleObject( 0 )失敗返回
所以ReleaqseMutex只有被執行一次, 沒有兩次.


查看完整回答
反對 回復 2023-03-06
  • 1 回答
  • 0 關注
  • 92 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號