有关多线程的一个简单的有关问题

有关多线程的一个简单的问题本帖最后由 Programe_Lover 于 2013-04-10 15:25:25 编辑#includeiostream#i

有关多线程的一个简单的问题
本帖最后由 Programe_Lover 于 2013-04-10 15:25:25 编辑

#include<iostream>
#include<windows.h>
using namespace std;

int number1=100;
int number2=100;

DWORD WINAPI FunProc1(LPVOID lpParameter);
DWORD WINAPI FunProc2(LPVOID lpParameter);

HANDLE hmutex;

int main()
{
HANDLE hthread1=CreateThread(NULL,0,FunProc1,NULL,0,NULL);
HANDLE hthread2=CreateThread(NULL,0,FunProc2,NULL,0,NULL);

CloseHandle(hthread1);
CloseHandle(hthread2);

hmutex=CreateMutex(NULL,FALSE,NULL);
WaitForSingleObject(hmutex,INFINITE);

cout<<"This is the main thread!"<<endl;

ReleaseMutex(hmutex);
//ReleaseMutex(hmutex);
Sleep(1000);
return 0;
}

DWORD WINAPI FunProc1(LPVOID lpParameter)
{
WaitForSingleObject(hmutex,INFINITE);

while(number1>0)
cout<<"The number1 is:"<<number1--<<endl;

ReleaseMutex(hmutex);
return 0;
}

DWORD WINAPI FunProc2(LPVOID lpParameter)
{
WaitForSingleObject(hmutex,INFINITE);

while(number2>0)

cout<<"The number2 is:"<<number2--<<endl;
ReleaseMutex(hmutex);
return 0;
}
    在这里我想问两个问题,一个是,我在主线程中(main函数中)创建互斥对象的时候,既然创建的时候CreateMutex函数的第二个参数为FALSE,那么为什么要两次调用ReleaseMutex函数,而在子线程中却只需要调用一次!(在孙鑫老师的书里明确指出了要调用两次,但是我还是不明白!)
    第二个就是,请有空的人帮我把这个代码运行一下,谢谢,为什么老是输出混乱,不管我将main函数中的ReleaseMutex注释还是不注释,结果都是十分混乱,求大神解释一下!(第一次运行可能结果正确,但是多运行几次就会出现输出混乱,不明白是为什么!)

[解决办法]
CreateThread执行后,FunProc1就可能先于CreateMutex执行前就等待hmutex,此时hmutex还是NULL值。