Win32 Thread API学习之Event Objects
来源:互联网 发布:华为西研所云计算部门 编辑:程序博客网 时间:2024/06/09 13:56
Win32中最具有弹性的同步机制就属events对象了。Event对象是一种核心对象,它的唯一目的就是成为激发状态或未激发状态。这两种状态完全由程序来控制,不会成为Wait…()函数的副作用。
Event对象之所以有大用途,正是因为它的状态完全在你掌握之下。Mutexes和Semaphores就不一样了,他们的状态会因为诸如WaitForSingleObject()之类的函数调用而变化。所以,你可以精确告诉一个event对象做什么事情,以及什么时候去做。
Event对象被运用在多种类型的高级I/O操作中。Event对象也可以用来设计你自己的同步对象。
产生一个event对象,可以调用CreateEvent():
CreateEvent
The CreateEvent function creates a named or unnamed event object.
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes, // pointer to security attributes
BOOL bManualReset, // flag for manual-reset event
BOOL bInitialState, // flag for initial state
LPCTSTR lpName // pointer to event-object name
);
For Example:
hEvent = CreateEvent(NULL,TRUE,FALSE," Event");
其中bManualReset需要特别说明一下:
如为FALSE,表示这个event将在变成激发状态(因而唤醒一个线程)之后,自动重置(reset)为非激发状态。如果是TRUE,表示不会自动重置,必须靠程序操作(调用ResetEvent())才能将激发状态的event重置为非激发状态。
Return Values
If the function succeeds, the return value is a handle to the event object. If the named event object existed before the function call, the GetLastError function returns ERROR_ALREADY_EXISTS. Otherwise, GetLastError returns zero.
If the function fails, the return value is NULL.
与Event相关的几个API函数:
SetEvent(),把event对象设为激发状态
ResetEvent(),把event对象设为非激发状态,Reset的意思是“设定为非激发状态”,而不是“重新设定为激发状态”
PulseEvent(),如果是一个Manual Reset Event:把event对象设为激发状态,唤醒“所有”等待中的线程,然后event恢复为非激发状态。如果是一个Auto Reset Event:把event对象设为激发状态,唤醒“一个”等待中的线程,然后event恢复为非激发状态
如果是automatic,那event总是处于非激发状态,所以按下ResetEvent不会产生什么效果。但按下SetEvent和PulseEvent会唤醒一个等待中的线程。
如果是manual,event对象可能是激发的,也可能是非激发,视上一次调用的是SetEvent()或ResetEvent()而定。按下SetEvent会使得每一个等待中的线程立刻苏醒。按下PulseEvent会使的目前等待中的所有线程苏醒过来(随后立刻又进入等待状态)。
侯杰大叔翻译的书也搞死我了!Sigh。感觉概念很模糊,看得我一头雾水,来来回回看了好几遍了,还不知道自己是不是已经懂了。5555555。可能是多线程搞得太少的原因吧。加油了。继续看。恩。
<SCRIPT type=text/javascript> <!--google_ad_client = "pub-6457474891690507";google_ad_width = 728;google_ad_height = 90;google_ad_format = "728x90_as";google_ad_type = "text_image";google_ad_channel = "";//--> </SCRIPT><SCRIPT src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript> </SCRIPT>- Win32 Thread API学习之Event Objects
- Win32 Thread API学习之Critical Sections
- Win32多线程之事件(Event Objects)
- Win32 Thread API学习
- 《Win32多线程程序设计》(6)---事件(Event Objects)
- 从Win32 API封装Thread类[1]
- 从Win32 API封装Thread类[2]
- 从Win32 API封装Thread类[1]
- 从Win32 API封装Thread类[2]
- Win32 API 之 InterlockedExchangePointer
- Socket 学习之 WIN32-API(1):简单通信
- Using Event Objects
- event objects 小记录
- Win32多线程之被激发的对象(Signaled Objects)
- 【Win32 API学习】RegisterWindowMessage函数
- 【Win32 API学习】RegisterWindowMessage小记
- win32 调试 API 学习总结
- win32 字体 api学习总结
- 类集
- 系统理解Win32 API和MFC(下)
- HD Photo其中DC,LOWPASS,HIGHPASS是如何定义的?
- C#与javascript中split用法不同
- 继承,接口和抽象类
- Win32 Thread API学习之Event Objects
- java输入输出
- hibernate使用sql-query心得
- 在程序中实现注册dll
- oracle语法
- Linux中链接库使用和实现
- 中国黑客自揭黑色产业链条:做病毒一定要低调
- oracle一千问
- 我的理想