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

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

3個子線程,都等待同一個mutex,但都只申請不釋放,為啥不會發生死鎖,請問是線程結束后自動釋放么?

3個子線程,都等待同一個mutex,但都只申請不釋放,為啥不會發生死鎖,請問是線程結束后自動釋放么?

C++
慕無忌1623718 2023-03-03 10:06:33
書上說“如果擁有某mutex之線程結束了,該mutex會被自動清除的唯一情況是:此線程是最后一個與該mutex handle有關聯的線程.否則此核心對象的引用計數仍然是比0大:其他線程(以及進程)仍然可以擁有此mutex的合法handle.然而.當線程結束而沒有釋放某個mutex時,有一種特殊的處理方式.”以及“在各種同步機制中是獨一無二的.如果線程擁有一個mutex而在結束前沒有調用ReleascMutex(), mutex不會被摧毀.取而代之的是,該mutex會被視為“未被擁有”以及“未被激發”.而下一個等待中的線程會被以WAIT_ABANDONED_0通知.不論線程是因為ExitThread()而結束,或是因當掉而結束,這種情況都存在?!闭垎柺鞘裁匆馑?nbsp;代碼:#include <iostream>using namespace std;#include <Windows.h>#include <stdio.h>#include <stdlib.h>HANDLE hMutex;DWORD WINAPI ThreadFun(LPVOID);#define Thread_Num 3int main(){int id;HANDLE handle[Thread_Num];hMutex=CreateMutex(NULL,FALSE,NULL);for(int i=0;i<Thread_Num;i++){handle[i]=CreateThread(NULL,0,ThreadFun,(LPVOID)i,0,(LPDWORD)&id);if(handle[i]){cout<<"線程"<<id<<"被創建"<<endl;}}WaitForMultipleObjects(Thread_Num,handle,TRUE,INFINITE);system("pause");return EXIT_SUCCESS;}DWORD WINAPI ThreadFun(LPVOID lp){DWORD result=WaitForSingleObject(hMutex,INFINITE);cout<<(int)lp<<endl;WaitForSingleObject(hMutex,INFINITE);return 0;}
查看完整描述

1 回答

?
偶然的你

TA貢獻1841條經驗 獲得超3個贊

問題出在CreateMutex()函數調用的參數上。把第二個參數改為true或者TRUE就行了。
為什么會出現這個問題?第二個參數指定這個互斥量是否立即被這個進程使用,如果指定為true,則立即生效,否則無效的.
呵呵,這個問題挺隱晦的(以后得小心了)!
你的線程里不要直接使用在main()中定義的循環變量,這會出問題的,也就是臨界區問題!
你問的問題線程會自動釋放互斥量嗎?當然不會的,只有當進程退出后,未被釋放的互斥量會被操作系統釋放的。
我提個小建議,閣下應該改改你的編碼風格了,你目前使用的編碼風格不大漂亮!呵呵
下面是改過的源代碼(加了一些注釋,你可以看看).. 有問題的話追問!

#include <iostream>
#include <Windows.h>
#include <stdio.h>
#include <stdlib.h>
using namespace std;

#define Thread_Num 3 //C++中盡量不要用宏,應該使用const int thread_num = 3; 
/*變量名對象名一般全小寫,宏的名字一般用全部大寫*/
HANDLE hMutex;
DWORD WINAPI ThreadFun(LPVOID); 

int main() {
int id;
HANDLE handle[Thread_Num];
hMutex=CreateMutex(NULL,TRUE,NULL);
for(int i=0;i<Thread_Num;i++) {
/*在線程中不要直接使用i*/
handle[i]=CreateThread(NULL,0,ThreadFun,(LPVOID)i,0,(LPDWORD)&id);
if(handle[i]) {
cout<<"線程"<<id<<"被創建"<<endl;
}
}
WaitForMultipleObjects(Thread_Num,handle,TRUE,INFINITE);
system("pause");
return EXIT_SUCCESS; //這一行可以不要的,編譯器會自動加上去的
}
DWORD WINAPI ThreadFun(LPVOID lp) {
WORD result=
WaitForSingleObject(hMutex,INFINITE);
cout<<(int)lp<<endl;
WaitForSingleObject(hMutex,INFINITE);
return 0;
}


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

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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