【转】Mutex使用方法(精辟)
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使用方法(精辟)相关推荐
- .NET 中使用 Mutex 进行跨越进程边界的同步 - walterlv
.NET 中使用 Mutex 进行跨越进程边界的同步 - walterlv 原文:.NET 中使用 Mutex 进行跨越进程边界的同步 - walterlv .NET 中使用 Mutex 进行跨越进程 ...
- 【转】pthread mutex 基本用法
转自:pthread mutex 基本用法 | feng 言 feng 语 锁是程序中经常需要用到的机制,尤其是多线程的程序中,如果没有锁的帮助,线程间的同 步就会非常麻烦甚至不可能.pthread中 ...
- C#之:线程同步 Mutex类
Mutex(互斥锁): Mutex: 命名空间:System.Threading 一个同步基元,也可用于进程间同步.是.NET Framework 中提供跨多个线程,或多个进程同步访问的一个类.它非常 ...
- C#中Mutex的用法
C#中Mutex是互斥锁,位于System.Threading 命名空间中. 顾名思义,它是一个互斥的对象,同一时间只有一个线程可以拥有它,该类还可用于进程间同步的同步基元. 如果当前有一个线程拥有它 ...
- Go互斥锁(Mutex)
目录 Mutex 状态 正常模式和饥饿模式 加锁和解锁 小结 Mutex Go 语言的 sync.Mutex 由两个字段 state 和 sema 组成.其中 state 表示当前互斥锁的状态,而 s ...
- Golang sync.Mutex分析
sync.Mutex是一个不可重入的排他锁.当一个 goroutine 获得了这个锁的拥有权后, 其它请求锁的 goroutine 就会阻塞在 Lock 方法的调用上,直到锁被释放. sync.Mut ...
- Golang sync.Mutex源码分析
sync.Mutex是一个不可重入的排他锁. 这点和Java不同,golang里面的排它锁是不可重入的.当一个 goroutine 获得了这个锁的拥有权后, 其它请求锁的 goroutine 就会阻塞 ...
- C#技术内幕 学习笔记
引用类型是类型安全的指针,它们的内存是分配在堆(保存指针地址)上的. String.数组.类.接口和委托都是引用类型. 强制类型转换与as类型转换的区别:当类型转换非法时,强制类型转换将抛出一个Sys ...
- Go中协程间通信的方式Sync.Cond
在Go中协程间通信的方式有多种,最常用的是channel.如果牵扯多个协程的通知,可以使用sync.Cond. 1. 程序中的通信方式 GO语言中有句名言:"不要用共享内存来通信,而是使用通 ...
最新文章
- 197. 阶乘分解【数论】
- 修改mongodb最大查询数_关于MongoDB最大连接数的查看与修改
- Python技巧-只用一行代码轻松实现图片文本识别
- ~~做过的好玩的题~~
- Linux命令:iptables网络防火墙
- IOS15之JSON的解析字典转模型
- html5游戏开发--动静结合(二)-用地图块拼成大地图 初探lufylegend
- python工资一般多少西安-python西安薪资
- linux下安装apache mysql,linux下常见的apache+mysql+php的安装
- 大一c语言上机题库及详解答案,二级C语言上机题答案(题库答案).doc
- 【JSP】 # JSP入门及简单概述
- 苹果手机怎么识别文字
- Maven安装和使用(详细版)
- 【渝粤教育】电大中专中药炮制学作业 题库
- Qt 中大尺寸图片的处理
- 计算机 难题_寻找免费难题的最佳网站
- 云计算技术 实验三 安装Hadoop系统并熟悉hadoop命令
- [心情] 如果有一天
- Redis的下载安装运行
- 3D模型欣赏:清纯美丽小姐姐
热门文章
- ★教师工资为什么这么低?/整理
- [原]Failed to load SELinux policy. System Freezing ----redhat7or CentOS7 bug
- 使用VMware桥接模式组建局域网测试MSMQ(二)
- [LeetCode-JAVA] Reverse Nodes in k-Group
- soj1201- 约数
- Individual Project-——word_frequency——final requirement
- Silverlight游戏设计(Game Design):(四)从零开始搭建游戏主体框架
- 18种方法让你集中精力工作
- 《JAVA练习题目5》 请在类中定义计算阶乘的方法完成本题目的求解
- android复制链接到粘贴板,Android复制粘贴到剪贴板