3个子线程,都等待同一个mutex,但都只申请不释放,为啥不会发生死锁,请问是线程结束后自动释放么?

书上说“如果拥有某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 3
int 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;
}

慕无忌1623718
浏览 142回答 1
1回答

偶然的你

问题出在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;&nbsp;/*变量名对象名一般全小写,宏的名字一般用全部大写*/HANDLE hMutex;DWORD WINAPI ThreadFun(LPVOID);&nbsp;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;}
打开App,查看更多内容
随时随地看视频慕课网APP