菜鸟始终不明白互斥对象和 WaitForSingleObject!
来源:互联网 发布:依斯莉8杯水套淘宝真假 编辑:程序博客网 时间:2024/06/05 22:43
我正在学孙鑫老师的“利用互斥对象实现线程同步” 一节, 教材上如下写到:
WaitForSingleObject(hMutex,INFINITE);
hMutex 为已创建的 互斥对象的句柄,一旦互斥对象处于有信号状态,则该函数返回。
如果互斥对象始终处于无信号状态,即未通知状态,则函数一直等待。
我的问题是:
什么是“信号状态”,什么又是“无信号状态”?
什么东西才有以上两种状态?
WaiForSingleObject 到底是干什么用的?
互斥对象又是干啥用的?
同一个互斥对象在某一时刻是不是只能被一个线程使用?
一大堆疑惑。。。。
请用通俗易懂的语言回答, 不要粘贴, 网上的资料我大都已经看过了,越看越晕,还是不明白。。
WaitForSingleObject(hMutex,INFINITE);
hMutex 为已创建的 互斥对象的句柄,一旦互斥对象处于有信号状态,则该函数返回。
如果互斥对象始终处于无信号状态,即未通知状态,则函数一直等待。
我的问题是:
什么是“信号状态”,什么又是“无信号状态”?
什么东西才有以上两种状态?
WaiForSingleObject 到底是干什么用的?
互斥对象又是干啥用的?
同一个互斥对象在某一时刻是不是只能被一个线程使用?
一大堆疑惑。。。。
请用通俗易懂的语言回答, 不要粘贴, 网上的资料我大都已经看过了,越看越晕,还是不明白。。
////////////////////////////////////////////////////////////////////////////////////////
用最简单的语言说就是这个对象有两个状态比如我们称0和1,称什么一点也不重要,有信号和无信号就是相对的两个状态,没什么意义,你就认为一个状态是0另一个状态是1。
在程序里如果加了WaitForSingleObject,那么程序到这里就去检测你给他的那个句柄的状态,如果是0程序就停在这里了,如果是1,程序就继续下去。
那么线程同步就要利用这两个状态。假如你有两个线程,都有可能访问同一个文件,而同一个文件是不能被两个线程同时写入的,那么你就需要在写入之前先判断文件有没有被另一个线程在写入,如果有则等着,等另一个线程写完之后你再继续,我们不能用一个死循坏来尝试打开文件知道成功为止,这样会让CPU有非常高的占用率。
这里你就要创建一个对象,这个对象有两个状态,我们约定,如果一个线程要写入文件之前就把这个对象状态变成0,写完之后把它变回1,那么另一个线程在写文件之前只要检测这个对象是不是为0就可以确定文件有没有被另一个线程在写入了。检测的过程就用WaitForSingleObject来操作,如果为1,WaitForSingleObject就和没这句话一样立刻执行下去了,如果那个对象是个0,那么WaitForSingleObject就会停在这里等,等到另一个线程写完文件,因为那个线程在写完文件之后会把对象变成1。
这个状态1我们命名为有信号状态,状态0我们称无信号状态。我们就把这个对象叫做互斥体,他起到了对这个文件读写的互斥作用。这整个写文件之前之后改变互斥体状态,写之前检测互斥体状态这个过程就是一个线程的同步。
同步是编程的人自己要考虑的问题,系统不会帮你同步,也就是说我们进行了上述的约定之后,你在编程的时候必须要在写入文件之前将互斥体置为无信号状态,写完之后置为有信号状态。
这样应该好懂了吧?不懂继续追问吧。
43275239 | 浏览 8049 次
0 0
- 菜鸟始终不明白互斥对象和 WaitForSingleObject!
- CreateMutex 和 WaitForSingleObject互斥对象
- 临界区、互斥对象、WaitForSingleObject、WaitForMultipleObjects
- WaitForSingleObject函数用法及互斥对象的理解 .
- CreateMutex、WaitForSingleObject、ReleaseMutex——创建互斥对象
- 内核对象和线程同步—WaitForSingleObject
- WaitForSingleObject与事件、信号量、互斥、临界区的用法
- WaitForSingleObject与事件、信号量、互斥、临界区的用法
- 互斥对象和线程同步
- [多线程] 互斥对象和锁
- 多线程实例--互斥对象和事件对象
- 创建互斥对象
- 对象互斥
- 互斥对象(转)
- 互斥对象
- 互斥内核对象
- 互斥内核对象
- 互斥对象
- 【学校OJ】二分图匹配 骑士共存问题
- 过了太久我已经不记得这个是啥玩意了,隐约觉得第二第三题方法都太笨了
- C语言基础练习题c语言试题100道(前三十道)
- 数据库关键字
- Angular4学习笔记(四):service
- 菜鸟始终不明白互斥对象和 WaitForSingleObject!
- hud 2084
- 1204: 杨八方的数学问题 [数学]
- json字符串转数组、对象(json_decode)
- ES6学习笔记: let 和 const 命令
- Latex入门
- Servle获取路径
- ASN.1探索 - 2 基础知识(2)
- Error:(1, 0) Minimum supported Gradle version is 3.3. Current version is 2.14.1.