菜鸟始终不明白互斥对象和 WaitForSingleObject!

我正在学孙鑫老师的“利用互斥对象实现线程同步”一节,教材上如下写到:WaitForSingleObject(hMutex,INFINITE);hMutex为已创建的互斥对... 我正在学孙鑫老师的“利用互斥对象实现线程同步” 一节, 教材上如下写到:

WaitForSingleObject(hMutex,INFINITE);
hMutex 为已创建的 互斥对象的句柄,一旦互斥对象处于有信号状态,则该函数返回。
如果互斥对象始终处于无信号状态,即未通知状态,则函数一直等待。

我的问题是:

什么是“信号状态”,什么又是“无信号状态”?
什么东西才有以上两种状态?
WaiForSingleObject 到底是干什么用的?
互斥对象又是干啥用的?
同一个互斥对象在某一时刻是不是只能被一个线程使用?

一大堆疑惑。。。。

请用通俗易懂的语言回答, 不要粘贴, 网上的资料我大都已经看过了,越看越晕,还是不明白。。。。
展开
 我来答
Frank7258
推荐于2017-11-24 · TA获得超过1503个赞
知道小有建树答主
回答量:381
采纳率:0%
帮助的人:554万
展开全部
用最简单的语言说就是这个对象有两个状态比如我们称0和1,称什么一点也不重要,有信号和无信号就是相对的两个状态,没什么意义,你就认为一个状态是0另一个状态是1。
在程序里如果加了WaitForSingleObject,那么程序到这里就去检测你给他的那个句柄的状态,如果是0程序就停在这里了,如果是1,程序就继续下去。

那么线程同步就要利用这两个状态。假如你有两个线程,都有可能访问同一个文件,而同一个文件是不能被两个线程同时写入的,那么你就需要在写入之前先判断文件有没有被另一个线程在写入,如果有则等着,等另一个线程写完之后你再继续,我们不能用一个死循坏来尝试打开文件知道成功为止,这样会让CPU有非常高的占用率。
这里你就要创建一个对象,这个对象有两个状态,我们约定,如果一个线程要写入文件之前就把这个对象状态变成0,写完之后把它变回1,那么另一个线程在写文件之前只要检测这个对象是不是为0就可以确定文件有没有被另一个线程在写入了。检测的过程就用WaitForSingleObject来操作,如果为1,WaitForSingleObject就和没这句话一样立刻执行下去了,如果那个对象是个0,那么WaitForSingleObject就会停在这里等,等到另一个线程写完文件,因为那个线程在写完文件之后会把对象变成1。
这个状态1我们命名为有信号状态,状态0我们称无信号状态。我们就把这个对象叫做互斥体,他起到了对这个文件读写的互斥作用。这整个写文件之前之后改变互斥体状态,写之前检测互斥体状态这个过程就是一个线程的同步。
同步是编程的人自己要考虑的问题,系统不会帮你同步,也就是说我们进行了上述的约定之后,你在编程的时候必须要在写入文件之前将互斥体置为无信号状态,写完之后置为有信号状态。
这样应该好懂了吧?不懂继续追问吧。
jiashuaihi
2011-03-15 · TA获得超过534个赞
知道小有建树答主
回答量:535
采纳率:0%
帮助的人:482万
展开全部
事件,互斥量,信号量等都有这么个状态。
waitforsingglleobject 就是等待对象有信号状态。
waitforsingleobject 检测hmux是否有状态,如果没有,该线程被挂起,系统调度运行其他线程,等hmux被设置为有信号(该操作一般在其他线程中),那么前面那个线程进入准备状态,可以再去执行下面的程序。所以原来的线程在hmux未被置为有信号之前,是不能运行的。
你可以把这个什么状态理解为一个布尔变量
如果有个资源同一时刻只能被一个线程访问,那么用一个互斥量是有必要的,因为在一个线程得到互斥量后,如果不释放,那么其他线程在调用waitforsingleobject时,将会一直堵塞。这就保证了同一资源不会被多线程破坏
追问
什么是信号状态?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
精装工程师
2011-03-22 · TA获得超过236个赞
知道小有建树答主
回答量:111
采纳率:50%
帮助的人:56.6万
展开全部
通过CreateEvent创建出来的就是一个信号量,调用该函数时通过参数可指定该信号量的初始值,是否手工复位等属性
调用SetEvent可以使信号量处于有信号状态,如果创建时指定的是自动复位,则在WaitForSingleObject调用返回后,该信号量自动变为无信号状态,如果指定的是手工复位,则即使WaitFor...返回以后该信号量仍然处于有信号状态,必须用ResetEvent来将该信号量恢恢复到无信号状态
通过CreateMutex同样也可以创建一个信号量,只不过这个信号量需要用ReleaseMutex才能释放,也就是说当一个线程通过WaitFor....返回以后,在该线程调用ReleaseMutex之前,其它线程的WaitFor...都会挂起,这就是互斥,用于互斥操作的还有很多种,一般的书上都有介绍的
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
日晞Pisces
2011-03-15 · 超过19用户采纳过TA的回答
知道答主
回答量:70
采纳率:0%
帮助的人:47.5万
展开全部
什么是“信号状态”,什么又是“无信号状态”?
re:为什么要用信号状态,举个例子:我想喝水,杯子里面有水,你才会去喝,就需要一个信号通知你水满了。那个通知你水满的信号,可以认为是“信号状态”,反之,就是“无信号状态”;
线程的同步,就是要有一个信号通知另一个线程,已经“准备好”;

什么东西才有以上两种状态?
re:你可以参考《计算机操作系统》,上面的进程和线程同步和互斥的那些资料。互斥量(加锁)主要解决线程或者进程访问临界区或者互斥资源的。信号量主要是进程或者线程解决同步问题的。

WaiForSingleObject 到底是干什么用的?
re:唤醒另一个线程,告诉该线程"我已经准备好";

互斥对象又是干啥用的?
re:互斥对象,比如CPU,在同一时间,只允许一个线程进行访问。互斥对象就是在同一时间,只允许一个进程或者线程访问的对象,比如,cpu,一个全局变量,一段共用代码。。。

同一个互斥对象在某一时刻是不是只能被一个线程使用?
re:没错。同一个互斥对象在某一时刻(同一时间)只能被一个线程使用。
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
gis19831203
2011-03-16 · TA获得超过690个赞
知道小有建树答主
回答量:914
采纳率:0%
帮助的人:838万
展开全部
你可以看看<windows核心编程>的第9章和第3章,里面对线程同步和内核对象有相当清楚的描述.
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(3)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式