Event事件疑问?

花熊 2011-07-08 10:21:14
无聊看了下CreateEvent的msdn解释:
When the state of a manual-reset event object is signaled, it remains signaled until it is explicitly reset to nonsignaled by the ResetEvent function. Any number of waiting threads, or threads that subsequently begin wait operations for the specified event object, can be released while the object's state is signaled.

When the state of an auto-reset event object is signaled, it remains signaled until a single waiting thread is released; the system then automatically resets the state to nonsignaled. If no threads are waiting, the event object's state remains signaled.

我就在想,如果几个线程都在wait这一个人工重置的事件,之后都马上调用ResetEvent function to reset the state of an event object to nonsignaled. 那么等待该事件的哪些线程会变得可调度,应该是不确定的吧?可能在wait之后到ResetEvent之前这个时间段切换到另一个线程了,这时事件是有信号的,但核心编程又说"当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程",有点晕,求教.

...全文
99 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sharptiger123 2011-07-08
  • 打赏
  • 举报
回复
OPenEvent吧
chenjiawei007 2011-07-08
  • 打赏
  • 举报
回复
多线程执行

WaitForSingleObject(hEvent,INFINITE) ;

此处还会加入其它线程的执行片段。

ResetEvent(hEvent) ;

windows下同等优先级线程下完全是随机的。
花熊 2011-07-08
  • 打赏
  • 举报
回复
自己写了个测试代码,

WaitForSingleObject(hEvent,INFINITE) ;
ResetEvent(hEvent) ;
TRACE("wait1 sucess\n") ;

明显不一定能全部等到,随机几率。
ouyh12345 2011-07-08
  • 打赏
  • 举报
回复
这种情况,bc2个线程是否能wait到,得看运气
花熊 2011-07-08
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 visualeleven 的回复:]
当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程
------------------------------------------
这个已经说的很清楚了吧,CreateEvent()调用的时候是看你创建的是人工重置事件还是自动重置事件。当你创建的是人工重置事件的时候,当事件有信号时,所有等待该事件……
[/Quote]
我的意思是wait之后马上reset,比如ABC三个线程wait,可能是A先Wait并执行了reset,CPU再转而执行B或C,这时B能wait到吗?就像执行PulseEvent,我们应该也不能保证所有的线程都变成可调度吧
ouyh12345 2011-07-08
  • 打赏
  • 举报
回复
当然会获得信号,直到调用ResetEvent
Eleven 2011-07-08
  • 打赏
  • 举报
回复
当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程
------------------------------------------
这个已经说的很清楚了吧,CreateEvent()调用的时候是看你创建的是人工重置事件还是自动重置事件。当你创建的是人工重置事件的时候,当事件有信号时,所有等待该事件对象的线程都会唤醒,都成为可以调度的线程,只要得到CPU就可以马上运行。如果是自动重置事件,所有等待该事件对象的线程中只会有一个被唤醒成为可调度线程。

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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