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;
}
- 1 回答
- 0 关注
- 100 浏览
添加回答
举报