自己写了一个类,用于互斥
class CMutex
{
public:
CMutex()
{
m_lock=CreateMutex(NULL,FALSE,NULL);
}
~CMutex(){}
void Lock()
{
WaitForSingleObject(m_lock, INFINITE);
}
void UnLock()
{
ReleaseMutex(m_lock);
}
private:
HANDLE m_lock;
};
原先的调用方式是这样的:
int main(int args,char ** argu[])
{
CMutex m_mutex;
while(TRUE)
{
m_mutex.Lock();
printf("a\n");
//m_mutex.UnLock();
}
}
虽然我注释掉了 m_mutex.UnLock(); 这一行代码,但是控制台依然不断的输出 a..... 为什么 WaitForSingleObject(m_lock, INFINITE); 没有起作用呢?后来找了找资料发现,问题是这样的:当CreateMutex()函数的第二个参数是FALSE,表示创建的这个Mutex处于空闲的状态,此时m_lock处于有信号,第一次调用WaitForSingleObject后,m_lock被转成无信号状态,然而之后并没有线程与之对应,m_lock又处于有信号状态,再次调用WaitForSingleObject仍然能够返回。下面这段程序能够成功演示互斥量的等待:
#include <stdio.h>
#include "Mutex.h"
CMutex m_mutex;
DWORD WINAPI ThreadProc(LPVOID lpParam)
{
m_mutex.Lock();
Sleep(3000);
m_mutex.UnLock();
Sleep(3000);
return 0;
}
int main(int args,char ** argu[])
{
DWORD IDThread;
int a=0,b=0;
a=GetTickCount();
CreateThread(NULL,0,ThreadProc,NULL,0,&IDThread);
Sleep(2);//建立线程需要时间
m_mutex.Lock();
b=GetTickCount();
printf("%dms\n",b-a);
m_mutex.UnLock();
system("pause");
}
结果输出为2995ms,说明线程中的 m_mutex.Lock() 返回后,m_lock处于无信号状态,一直到m_mutex.UnLock()后,m_lock又重新处于有信号状态。倘若注释掉线程中的 m_mutex.Lock() ,则结果为5993ms,说明 m_mutex.Lock() 返回后 直到该线程结束后,Mutex不在被任何线程调用,才转为有信号状态。