关于mutex的一些理解

来源:互联网 发布:孟泰龄网络自战解说 编辑:程序博客网 时间:2024/04/30 14:48

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

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

原创粉丝点击