WaitForSingleObject的误区?

pigsanddogs 2008-06-19 04:38:11
根据msdn上所说
Time-out interval, in milliseconds. The function returns if the interval elapses, even if the object's state is nonsignaled. If dwMilliseconds is zero, the function tests the object's state and returns immediately.
这里注重测试两字, 也就是当timeout位0时, 可以测试到信号量的状态,
按照ms的一般做法, 这应该是一种特例, 于是认为不会改变信号量的状态。

但是应用在auto的Event, Mutex,以及Semaphore上, 均发现改变信号量的状态
使得测试失去本意; 大家碰到需要测试上述三种类型的信号量的状态有什么好办法?
...全文
2253 19 打赏 收藏 转发到动态 举报
写回复
用AI写文章
19 条回复
切换为时间正序
请发表友善的回复…
发表回复
whomin 2008-06-23
  • 打赏
  • 举报
回复
WaitForSingleObject(event,0)会测试下当前event的状态然后立即返回。
若event已置位则返回WAIT_OBJECT_0,由于是auto的event,所以该event被检测后将自动复位(状态发生变化);若未置位则返回WAIT_TIMEOUT。

整个过程应该是非常清楚的,我不知道有什么问题,你可以如下建个应用程序测试下:
HANDLE evt= CreateEvent( NULL,false,true, NULL ); //创建个自动型事件,初始时就置位
DWORD result=WaitForSingleObject(evt,0);//此时由于事件是高位状态,所以result为WAIT_OBJECT_0
result=WaitForSingleObject(evt,0);//此时由于auto事件被检测后自动复位,所以result为WAIT_TIMEOUT
僵哥 2008-06-23
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 pigsanddogs 的回复:]
所谓的测试状态, 还是没人能解决。
解决后给分
[/Quote]
找微软(Microsoft)去吧。当然,给分是没有用的,给钱他们会不会考虑也难说^_^
pigsanddogs 2008-06-23
  • 打赏
  • 举报
回复
所谓的测试状态, 还是没人能解决。
解决后给分
僵哥 2008-06-20
  • 打赏
  • 举报
回复
Waitfor*
当你设置了超时时间(包括0值)而不是永久等待的话,就要判断返回值是否为WAIT_TIMEOUT,如果是就表示计时已到。你可以选择继续Wait也可以选择放弃。
wangyang327329 2008-06-20
  • 打赏
  • 举报
回复
对于自动重置Event内核对象而言,有所谓的“成功等待的副作用”,即只要WaitForSingle成功等待,不管等待时间是多长,对象均会改变成为无信号状态。具体细节你可以参考《Windows kernel programming》
arong1234 2008-06-20
  • 打赏
  • 举报
回复
如果你一定要说微软这个“必须”对的话,那你一定得看看auto事件得描述,他应该说了只要等待必然设置状态,那岂不是矛盾了
[Quote=引用 7 楼 pigsanddogs 的回复:]
按照msdn的解释, 这应该属于一种“特化”, 因为他明确的点名了他是一个test,
the function tests the object's state and returns immediately.
就如同timeout为-1时也是一种“特化”而已。

但实际结果如同cnzdgs所言, 这不属于“特化”, 而是因为时间短暂到了0而立刻返回而已。
这就是我认为的歧义所在。

主要的问题的, 对于auto类型event这种信号量, 如何测试他的状态?
[/Quote]
arong1234 2008-06-20
  • 打赏
  • 举报
回复
谁写文档都可能用到一些不准确的词的,尊重事实,而不是尊重文档。人家只是用到“test”的这个词,并没有特别强调他(如果他确实仅仅是test,一般微软对"特例"肯定会特别强调的)
[Quote=引用 7 楼 pigsanddogs 的回复:]
按照msdn的解释, 这应该属于一种“特化”, 因为他明确的点名了他是一个test,
the function tests the object's state and returns immediately.
就如同timeout为-1时也是一种“特化”而已。

但实际结果如同cnzdgs所言, 这不属于“特化”, 而是因为时间短暂到了0而立刻返回而已。
这就是我认为的歧义所在。

主要的问题的, 对于auto类型event这种信号量, 如何测试他的状态?
[/Quote]
whomin 2008-06-20
  • 打赏
  • 举报
回复
检查WaitForSingleObject的返回值不就可以么?
Auto 类型事件只是被检测后会自动复位(就是你所说的“均发现改变信号量的状态”),但WaitForSingleObject的返回值还是能体现事件是否发生的
arong1234 2008-06-20
  • 打赏
  • 举报
回复
1. 不要扣字眼
2. 一般情况下不需要测试,不知道你想测试干吗?
[Quote=引用楼主 pigsanddogs 的帖子:]
根据msdn上所说
Time-out interval, in milliseconds. The function returns if the interval elapses, even if the object's state is nonsignaled. If dwMilliseconds is zero, the function tests the object's state and returns immediately.
这里注重测试两字, 也就是当timeout位0时, 可以测试到信号量的状态,
按照ms的一般做法, 这应该是一种特例, 于是认为不会改变信号量的状态。

但是应用在auto的Event,…
[/Quote]
赵4老师 2008-06-20
  • 打赏
  • 举报
回复
参见《Windows核心编程》
僵哥 2008-06-20
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 AgedBOY 的回复:]
呵呵,楼主的意思是想说,“MSDN上明明说这是一个‘测试’用例,从论述的语义上讲,被‘测试’的对象应该是‘只读’的。然而MSDN让他失望了,WaitFor仍然改变了同步对象的状态——自动型的event,以及信号量。”

嗯,微软也没有说MSDN的100%正确的,楼主就别钻牛角尖了,事实已经说明了一切。

只是,event还好办,可以使用“手动档”的,信号量就有点郁闷了。如果你真的不想改变它,却又一定要测试一下,则只能当测试到…
[/Quote]
是否改变这个完全可以由设计来决定。MSDN当中WaitForSingleobject有这样一段话:
The function modifies the state of some types of synchronization objects. Modification occurs only for the object whose signaled state caused the function to return. For example, the count of a semaphore object is decreased by one.
AgedBOY 2008-06-20
  • 打赏
  • 举报
回复
呵呵,楼主的意思是想说,“MSDN上明明说这是一个‘测试’用例,从论述的语义上讲,被‘测试’的对象应该是‘只读’的。然而MSDN让他失望了,WaitFor仍然改变了同步对象的状态——自动型的event,以及信号量。”

嗯,微软也没有说MSDN的100%正确的,楼主就别钻牛角尖了,事实已经说明了一切。

只是,event还好办,可以使用“手动档”的,信号量就有点郁闷了。如果你真的不想改变它,却又一定要测试一下,则只能当测试到WAIT_OBJECT_0时,再赶紧把它“生产”回来。(我是说,WaitFor之于信号量不是相当于一次消费嘛...)
wzaen 2008-06-19
  • 打赏
  • 举报
回复
WaitForSingleObject是等待对象信号,
并且这部分功能是在原来基础之上衍生出来的,这是timeout=0时的意义所在;
对于对象状态的改变跟一般情况是一样的。
cnzdgs 2008-06-19
  • 打赏
  • 举报
回复
WaitForSingleObject函数是等待对象信号,dwMilliseconds参数是指定等待时间,函数中会不断检查对象状态,如果对象有信号则返回,若无信号,则判断是否超时,如未超时则继续循环。dwMilliseconds参数为0表示只做一次检查而不等待,这个参数只表示等待时间,没有其它含义,如果执行此函数之前对象就处于有信号状态,则dwMilliseconds的值是多少都是一样的。
pigsanddogs 2008-06-19
  • 打赏
  • 举报
回复
按照msdn的解释, 这应该属于一种“特化”, 因为他明确的点名了他是一个test,
the function tests the object's state and returns immediately.
就如同timeout为-1时也是一种“特化”而已。

但实际结果如同cnzdgs所言, 这不属于“特化”, 而是因为时间短暂到了0而立刻返回而已。
这就是我认为的歧义所在。

主要的问题的, 对于auto类型event这种信号量, 如何测试他的状态?
yjgx007 2008-06-19
  • 打赏
  • 举报
回复
均发现改变信号量的状态
使得测试失去本意;

什么意 思?
fangzheng2008 2008-06-19
  • 打赏
  • 举报
回复
up/////////////////////
cppwin 2008-06-19
  • 打赏
  • 举报
回复
这是auto类型事件的特点.

你可以使用ManualReset类型的事件.
凌乱1980 2008-06-19
  • 打赏
  • 举报
回复
同意cnzdgs 的解释

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧