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 關注
- 128 瀏覽
添加回答
舉報