第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

刪除其中的一句ReleaseMutex,但發(fā)現(xiàn)這樣做會(huì)導(dǎo)致互斥體不能被正常釋放。請(qǐng)問(wèn)這是怎么回事?

刪除其中的一句ReleaseMutex,但發(fā)現(xiàn)這樣做會(huì)導(dǎo)致互斥體不能被正常釋放。請(qǐng)問(wèn)這是怎么回事?

C++
慕尼黑5688855 2023-03-02 14:10:57
先上代碼吧://這是2個(gè)線程模擬賣火車票的小程序#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;//創(chuàng)建線程hThread1=CreateThread(NULL,0,Fun1Proc,NULL,0,NULL);hThread2=CreateThread(NULL,0,Fun2Proc,NULL,0,NULL);CloseHandle(hThread1);CloseHandle(hThread2);//創(chuàng)建互斥對(duì)象hMutex=CreateMutex(NULL,TRUE,_T("tickets"));//創(chuàng)建互斥體 一次運(yùn)行一個(gè)線程if (hMutex){if (ERROR_ALREADY_EXISTS==GetLastError()){cout<<"only one instance can run!"<<endl;return;}}WaitForSingleObject(hMutex,INFINITE);//等待進(jìn)入互斥體 INFINITE -1ReleaseMutex(hMutex);ReleaseMutex(hMutex);Sleep(3000);}//線程1的入口函數(shù)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的入口函數(shù)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;}在上面的代碼是一個(gè)多線程的模型,但這個(gè)模型中有一個(gè)很有趣的地方:原始作者用WaitForSingleObject(hMutex,INFINITE);語(yǔ)句來(lái)獲得互斥體,同時(shí)用ReleaseMutex(hMutex);語(yǔ)句來(lái)釋放互斥體,但仔細(xì)看代碼卻可以發(fā)現(xiàn),每一個(gè)WaitForSingleObject其實(shí)是對(duì)應(yīng)了兩句一摸一樣的釋放語(yǔ)句,看上去好像是每獲得一次互斥體就要釋放兩遍一樣。
查看完整描述

1 回答

?
holdtom

TA貢獻(xiàn)1805條經(jīng)驗(yàn) 獲得超10個(gè)贊

一個(gè)線程可以重復(fù)占有mutex, 占有幾次資源, 就要釋放幾次資源, 不然別的線程沒(méi)法獲得mutex
main()線程在CreateMutex(TRUE)的時(shí)候已經(jīng)占用資源, 在WaitForSingleObject( hMutex )再次占用, 他需要釋放兩次

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


查看完整回答
反對(duì) 回復(fù) 2023-03-06
  • 1 回答
  • 0 關(guān)注
  • 89 瀏覽

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)