Mutex物件的做法与特性如下:

  使用CreateMutex()来产生一个Mutex物件,而传入的Mutex名称字串用以区别不同的Mutex ,也就是说,不管是哪个Process/Thread,只要传入的名称叁数是相同的一个字串,那 CreateMutex()传回值(hMutex, handle of Mutex)会指向相同的一个Mutex物件。这和 Event物件相同。然而Mutex和Event有很大的不同,Mutex有Owner的概念,如果Mutex为 ThreadA所拥有,那麽ThreadA执行WaitForSingleObject()时,并不会停下来,而会立即 传回WAIT_OBJECT_0,而其他的Thread执行WaitForSingleObject()则会停下来,直到Mutex 的所有权被Release出来或Time Out。而Thread如何取得Mutex的所有权呢?主要如下:

1.CreateMutex(Byval 0, 1, "MyMutex") 第二个叁数传1进去,则第一个呼叫CreateMutex 且第二个叁数传1的Thread会拥有该Mutex。但如果第二个叁数传0进去,那代表 CreateMutex时,没有人拥有该Mutex。 2.承上的说明,如果Mutex没有拥有者,则第一个呼叫WaitForSingleObject的Thread 会拥有该Mutex。

  上面说过,只有拥有该Mutex的Thread在执行WaitForSingleObject()不会停下来,其他的 Thread则会停下来,那其他的Thread如何取得该Mutex的所有权呢?那必需是原先拥有该 Mutex的Thread以ReleaseMutex来放弃所有权,一旦所有权放出来,而有其他的Thread处 於WaitForSingleObject()的停留等待状态,则有一个Thread会即时取得该Mutex的所有权 (上面第2点的说明),所以,若其他的Thread也执行WaitForSingleObject()时,就会处於 等待的状态。正因WaitForSingleObject()会令Mutex处於UnSignal的状态(和Event不同), 所以可以完成同一时问只有一个thread来UpDate共用记忆体的需求(当然大家都要使用Mutex 的规则则来做,即想Update时,要使用WaitForSingleObject()来看看是否可取得Mutex的所 有权。)

  另有一件事要特别提出,如果一个Thread已取得Mutex的所有权,而它呼叫WaitForSingleObject() n 次,则也要使用ReleaseMutex n次才能够将Mutex的拥有权放弃,这和Event也不同,而 且,非Mutex拥有者呼叫ReleaseMutex也不会有任何作用。而每次以WaitForSingleObject 呼叫一次,Mutex会有一个计数器会加一,ReleaseMutex成功会减一,直到Mutex的计数 器为0之後,系统才会将之去除。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/ren062/archive/2008/10/13/3071034.aspx

转载于:https://www.cnblogs.com/lzhitian/archive/2012/11/28/2791884.html

【转】Mutex使用方法(精辟)相关推荐

  1. .NET 中使用 Mutex 进行跨越进程边界的同步 - walterlv

    .NET 中使用 Mutex 进行跨越进程边界的同步 - walterlv 原文:.NET 中使用 Mutex 进行跨越进程边界的同步 - walterlv .NET 中使用 Mutex 进行跨越进程 ...

  2. 【转】pthread mutex 基本用法

    转自:pthread mutex 基本用法 | feng 言 feng 语 锁是程序中经常需要用到的机制,尤其是多线程的程序中,如果没有锁的帮助,线程间的同 步就会非常麻烦甚至不可能.pthread中 ...

  3. C#之:线程同步 Mutex类

    Mutex(互斥锁): Mutex: 命名空间:System.Threading 一个同步基元,也可用于进程间同步.是.NET Framework 中提供跨多个线程,或多个进程同步访问的一个类.它非常 ...

  4. C#中Mutex的用法

    C#中Mutex是互斥锁,位于System.Threading 命名空间中. 顾名思义,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元. 如果当前有一个线程拥有它 ...

  5. Go互斥锁(Mutex)

    目录 Mutex 状态 正常模式和饥饿模式 加锁和解锁 小结 Mutex Go 语言的 sync.Mutex 由两个字段 state 和 sema 组成.其中 state 表示当前互斥锁的状态,而 s ...

  6. Golang sync.Mutex分析

    sync.Mutex是一个不可重入的排他锁.当一个 goroutine 获得了这个锁的拥有权后, 其它请求锁的 goroutine 就会阻塞在 Lock 方法的调用上,直到锁被释放. sync.Mut ...

  7. Golang sync.Mutex源码分析

    sync.Mutex是一个不可重入的排他锁. 这点和Java不同,golang里面的排它锁是不可重入的.当一个 goroutine 获得了这个锁的拥有权后, 其它请求锁的 goroutine 就会阻塞 ...

  8. C#技术内幕 学习笔记

    引用类型是类型安全的指针,它们的内存是分配在堆(保存指针地址)上的. String.数组.类.接口和委托都是引用类型. 强制类型转换与as类型转换的区别:当类型转换非法时,强制类型转换将抛出一个Sys ...

  9. Go中协程间通信的方式Sync.Cond

    在Go中协程间通信的方式有多种,最常用的是channel.如果牵扯多个协程的通知,可以使用sync.Cond. 1. 程序中的通信方式 GO语言中有句名言:"不要用共享内存来通信,而是使用通 ...

最新文章

  1. 197. 阶乘分解【数论】
  2. 修改mongodb最大查询数_关于MongoDB最大连接数的查看与修改
  3. Python技巧-只用一行代码轻松实现图片文本识别
  4. ~~做过的好玩的题~~
  5. Linux命令:iptables网络防火墙
  6. IOS15之JSON的解析字典转模型
  7. html5游戏开发--动静结合(二)-用地图块拼成大地图 初探lufylegend
  8. python工资一般多少西安-python西安薪资
  9. linux下安装apache mysql,linux下常见的apache+mysql+php的安装
  10. 大一c语言上机题库及详解答案,二级C语言上机题答案(题库答案).doc
  11. 【JSP】 # JSP入门及简单概述
  12. 苹果手机怎么识别文字
  13. Maven安装和使用(详细版)
  14. 【渝粤教育】电大中专中药炮制学作业 题库
  15. Qt 中大尺寸图片的处理
  16. 计算机 难题_寻找免费难题的最佳网站
  17. 云计算技术 实验三 安装Hadoop系统并熟悉hadoop命令
  18. [心情] 如果有一天
  19. Redis的下载安装运行
  20. 3D模型欣赏:清纯美丽小姐姐

热门文章

  1. ★教师工资为什么这么低?/整理
  2. [原]Failed to load SELinux policy. System Freezing ----redhat7or CentOS7 bug
  3. 使用VMware桥接模式组建局域网测试MSMQ(二)
  4. [LeetCode-JAVA] Reverse Nodes in k-Group
  5. soj1201- 约数
  6. Individual Project-——word_frequency——final requirement
  7. Silverlight游戏设计(Game Design):(四)从零开始搭建游戏主体框架
  8. 18种方法让你集中精力工作
  9. 《JAVA练习题目5》 请在类中定义计算阶乘的方法完成本题目的求解
  10. android复制链接到粘贴板,Android复制粘贴到剪贴板