当线程结束后会自动释放mutex么
创建3个子线程,都等待同一个mutex,但是都只申请不释放,为什么不会发生死锁,请问是线程结束后自动释放么?书上说“如果拥有某mutex之线程结束了,该mutex会被自动...
创建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;
} 展开
书上说“
如果拥有某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;
} 展开
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;
/*变量名对象名一般全小写,宏的名字一般用全部大写*/
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;
}
为什么会出现这个问题?第二个参数指定这个互斥量是否立即被这个进程使用,如果指定为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;
}
追问
那个参数设为TRUE 被主线程占用,后面的子线程就都等不到资源了,我本来的目的是想只让一个进程申请到mutex,然后它不释放,从而达到死锁。那个代码风格我从vs里粘过来就是这样了。。。宏定义那个我以后会注意的 谢谢 还有请问“你的线程里不要直接使用在main()中定义的循环变量,这会出问题的,也就是临界区问题!”这句话具体是什么意思呢 对我这个程序来说就是不使用handle[i]么 求教
追答
我不大明白你的第一个追问是啥意思,主线程怎么会占用mutex呢?第二个问题涉及到临界区问题:子线程使用main中的循环变量i,而主线程的for语句修改i。如果当i = 0时,主线程创建了一个线程并启动该线程(你可能希望这个线程输出0),但是恰好该子线程执行到第一个语句(WaitForSingleObject时,CPU决定让该线程暂时停止运行,转而去运行主线程,主线程接着修改i的值,最怕轮到那个子线程运行的时候,输出的值就不是预期的0了,可能你每次运行结果都正确,但是会有出错的时候。凡是多个线程同时使用修改某个共享数据,都会出现这种问题。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询