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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值