关于mutex的一些理解

自己写了一个类,用于互斥

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不在被任何线程调用,才转为有信号状态。
 
 

你可能感兴趣的:(关于mutex的一些理解)