为了账号安全,请及时绑定邮箱和手机立即绑定

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()而结束,或是因当掉而结束,这种情况都存在。”请问是什么意思 代码:#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 关注
  • 100 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信