关于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不在被任何线程调用,才转为有信号状态。
- 关于mutex的一些理解
- 关于mutex的一些思考
- 关于signal, kill, mutex, spinlock的一些总结
- Android中 Mutex的理解
- Android中 Mutex的理解
- 关于JAXB的一些理解
- 关于bitmap的一些理解
- 关于Hook的一些理解
- 关于JavaBean的一些理解
- 关于异常的一些理解
- 关于内存的一些理解
- 关于内存的一些理解
- 关于MFC的一些理解
- 关于编码的一些理解
- 关于枚举的一些理解
- 关于const的一些理解
- 关于矩阵的一些理解
- 关于编码的一些理解
- poj 1050 最大子矩阵和
- liferay项目部署报错 Service Builder BeanLocator has not been set
- 黑马程序员:银行业务调度系统
- HTTP Error 401.2 - Unauthorized iis7 错误
- ruby+watir--问题记录
- 关于mutex的一些理解
- 铺铜的相关资料
- 详解Java 7中新的文件API
- mount tmpfs
- SQL2005有几种约束?如何使用?
- Java静态变量的初始化(static块的本质)
- oracle性能优化sql注意
- ruby+watir--百度搜索示例
- 基于事件驱动的Oracle作业调度