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

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的一些理解相关推荐

  1. C# 多线程四:互斥量Mutex的简单理解与运用

    目录 一. 特点: 1.非静态类继承 2.可以跨进程 二.构造函数 1.Mutex() 2.Mutex(Boolean) 2. Mutex(Boolean, String) 3.Mutex(Boole ...

  2. MySQL mutex互斥锁

    在事务机制中,锁机制是为了保证高并发,数据一致性的重要实现方式.MySQL除了Innodb引擎层面的行锁,还有latch锁.latch锁的作用资源协调处理.包含表句柄,线程,cpu线程,内存池等.其保 ...

  3. 【ARM Cache 入门及渐进五--内存屏障ISB/DSB/DMB】

    文章目录 Cache 之内存屏障指令 1.1 内存屏障基本规则 1.2 DMB(数据存储屏障) 1.2.1 DMB 使用场景 1.3 DSB(数据同步屏障) 1.3.1 DSB 使用背景 1.3.2 ...

  4. 第12期《 蓄势待发 》1月刊

    1.<[DRP]使用PowerBuilder建立数据物理模型,并导入Oracle > --王雷 推荐理由:通过这次体验呢,小编真是开始接触了Oracle数据库,基本和其他的数据库都很相似, ...

  5. 关于thread中mutex相关内容的理解

    在C++11中,引入了thread线程库,而为了应对线程的同步,又引入了互斥量mutex,而又因为mutex的各种问题,后续又引申出了使得mutex更安全的机制. 下面就以我的个人理解,介绍一下. 值 ...

  6. 从Python角度理解mutex

    mutex(维基百科 ) According Wikipedia, Mutex(Mutual exclusion) 互斥锁,是一种用于多线程编程中,防止两条线程同时对同一公共资源(比如全局变量)进行读 ...

  7. Oracle Mutex 机制 说明

    之前也整理过一篇文章来说明Oracle Lock的,参考: 锁 死锁 阻塞 Latch 等待 详解 http://blog.csdn.net/tianlesoftware/archive/2010/0 ...

  8. [深入理解Android卷一全文-第九章]深入理解Vold和Rild

    为什么80%的码农都做不了架构师?>>>    由于<深入理解Android 卷一>和<深入理解Android卷二>不再出版,而知识的传播不应该因为纸质媒介的 ...

  9. C++11 并发指南三(std::mutex 详解)

    上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex ...

最新文章

  1. 移动开发者必须了解的三大职业趋势
  2. javascript 面向对象(转)
  3. Linux shell:shell 命令的返回值和输出
  4. JavaScript 数组 array.at() 获取数组中最后一个元素
  5. 前端开发的难点到底在什么地方?
  6. 犯罪分子社工GoDaddy 员工,获得密币相关网站域名的控制权
  7. Android时间戳与字符串相互转换
  8. python是什么语言-Python是什么?为什么现在越来越多的人选择学习Python语言
  9. 深入ASP.NET 2.0的提供者模型
  10. dom4j解析XML文件(4)—实战
  11. JavaSE环境搭建
  12. 主流漫游技术-OKC802.11r介绍
  13. Win10安装WSL-Ubuntu18.04
  14. 科学管理鼻祖:泰勒小传
  15. SteamOS—定制个人版的游戏主机
  16. ajax asp后台获取不到post数据,asp.net webapi [FromBody]string 获取不到ajax post的数据的解决方法...
  17. python版本降级
  18. 叶酸修饰靶向性紫杉醇 PGA-TAXOL/羟基靶向修饰透明质酸接枝姜黄素 OH-HA-CUR/羧基靶向修饰透明质酸接枝姜黄素 COOH-HA-CUR
  19. 视相关细节层次网格简化方法(VDPM-LOD)
  20. 登陆页面的获取验证码

热门文章

  1. 管理台权限模块 - 完整路由权限及按钮权限
  2. 优先使用 KTX 库 | MAD Skills
  3. 转载:计算机硕士工资表
  4. Perl中简体字转换为繁体字(GBK转换成big5)
  5. 大一小妹儿在线求解答???
  6. 微服务(SpringCloud)入门项目——外卖订单系统
  7. 深度分析:摩尔定律失效可能会影响全球经济
  8. win10安全模式进入方法
  9. css 实现蒙版效果
  10. 【教学类-35-01】带笔画步骤图的描字(姓氏)(A4整张)