先看模拟火车售票的这个程序:
#include "windows.h"
#include <iostream.h>//线程头文件
DWORD WINAPI ThreadProc1(LPVOID lpParameter);
DWORD WINAPI ThreadProc2(LPVOID lpParameter);
int index=0;
int ticket=100;
HANDLE hMutex;//一个互斥量
void main()
{
HANDLE hThread1=CreateThread(NULL,0,ThreadProc1,NULL,0,NULL);//创建线程,放回HANDLE
HANDLE hThread2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);
CloseHandle(hThread1);//我们对返回的HANDLE 不关心,要释放,否则计数器会+1
CloseHandle(hThread2);
//while(index++<1000)
// cout<<"main is running"<<endl;
hMutex=CreateMutex(NULL,FALSE,NULL);//TRUE 表示创建他的拥有他。即主线程拥有这个对象
//你一个参数为安全机制:NULL,第二个为FALSE表示手动指定拥有者,若为TRUE,其拥有者为创建他的进程,这里为main函数
//即主线程
Sleep(4000);
}
DWORD WINAPI ThreadProc1(LPVOID lpParameter)
{
// while(index++<1000)
// cout<<"Thread1 is running"<<endl;
while(TRUE)
{
WaitForSingleObject(hMutex,INFINITE);//等待互斥量的信号
if(ticket>0)
{
Sleep(1);
cout<<"Thread1 sell ticket"<<ticket--<<endl;
}
else
break;
ReleaseMutex(hMutex);
}
return 0;
}
DWORD WINAPI ThreadProc2(LPVOID lpParameter)
{
//while(index++<1000)
// cout<<"Thread1 is running"<<endl;
while(TRUE)
{
//互斥有id,会吃对象
WaitForSingleObject(hMutex,INFINITE);
if(ticket>0)
{
Sleep(1);
cout<<"Thread2 sell ticket"<<ticket--<<endl;
}
else
break;
ReleaseMutex(hMutex);//释放
}
return 0;
}
假如为CreateMutex第二个参数为TRUE,表示主线程拥有它,hMutex=CreateMutex(NULL,TRUE,NULL);//TRUE 表示创建他的拥有他。即主线程拥有这个对象
要是其他线程获得Mutex,必须先要释放:ReleaseMutex(hMutex);//释放
即:替换红色代码:hMutex=CreateMutex(NULL,TRUE,NULL);ReleaseMutex(hMutex);
再加入红色代码如下:hMutex=CreateMutex(NULL,TRUE,NULL);WaitForSingleObject(h