《Win32多线程程序设计》(1)---WaitForSingleObject()

来源:互联网 发布:2016网络知识竞赛平台 编辑:程序博客网 时间:2024/05/29 18:58
//调用WaitForSingleO bject() 并放置一个“线程核心对象”作为参数,将//使线程#1  开始睡眠,直到线程#2  结束为止。就像Sleep()  函数一样,//WaitForSingleObject() 也有一个参数用来指定最长的等待时间//DWORD WaitForSingleObject(//    __in HANDLE hHandle,//   __in DWORD dwMilliseconds//    );//参数//hHandle  等待对象的handle(代表一个核心对象)。//dwMilliseconds  等待的最长时间。时间终了,即使handle 尚未成为激发状态,此函数还是要返回。此值可以是0(代表立刻返回),也可以是INFINITE  代表无穷等待。 //返回值//如果函数失败,则传回WAIT_FAILED。这时候你可调用GetLastError() 取//得更多信息。此函数的成功有三个因素://1. 等待的目标(核心对象)变成激发状态。这种情况下返回值将为//WAIT_OBJECT_0。//2. 核心对象变成激发状态之前,等待时间终了。这种情况下返回值将为//WAIT_TIMEOUT。//3. 如果一个拥有mu tex(互斥器)的线程结束前没有释放mu tex,则传//回WAIT_ ABANDONED。
获得一个线程对象的handle  之后,WaitForSingleObject() 要求操作系统
让线程#1 睡觉,直到以下任何一种情况发生:
i 线程#2 结束
i dwMilliseconds 时间终了。该值系从函数调用后开始计算。
由于操作系统持续追踪线程#2,即使线程#2  失事或被强迫结束,

WaitForSingleObject() 仍然能够正常运作。

可被WaitForSingleO bject() 使用的核心对象有两种状态:激发与未激
发。WaitForSingleObject() 会在目标物变成激发状态时返回。


当核心对象被激发时,会导致WaitForSingleObject() 醒来。
当线程正在执行时,线程对象处于未激发状态。当线程结束时,线程对象
就被激发了。因此,任何线程如果等待的是一个线程对象,将会在等待对象结
束时被调用,因为当时线程对象自动变成激发状态。

核心对象激发状态的意义

Thread*(线程)  当线程结束时,线程对象即被激发。当线程还在进行时,则对象处于未激发状态。线程对象系由CreateThread() 或CreateRem oteThread() 产生

Process*(进程)  当进程结束时,进程对象即被激发。当进程还在进行时,则对象处于未激发状态。CreateProcess() 或OpenProcess() 会传回一个进程对象的handle
Change Notification  当一个特定的磁盘子目录中发生一件特别的变化时,此对
象即被激发。此对象系由FindFirstChangeNotification()
产生(译注)

Console Input*  当console  窗口的输入缓冲区中有数据可用时,此对象将处于激发状态。CreateFile() 和GetStdFile() 两函数可
以获得console  handle。

Event*  Event 对象的状态直接受控于应用程序所使用的三个Win32 函数:SetEvent()、PulseEvent()、ResetEvent()。CreateEvent() 和OpenEvent() 都可以传回一个event object handle。Event 对象的状态也可以被操作系统设定——如果使用于“overlapped”操作时

Mutex*  如果mut ex 没有被任何线程拥有,它就是处于激发状态。一旦一个等待mut ex 的函数返回了,mutex 也就自动重置为未激发状态。CreateMutex() 和OpenMutex() 都可以获得一个mutex  handle。

Semaphore*  Semaphore 有点像mut ex,但它有个计数器,可以约束其拥有者(线程)的个数。当计数器内容大于0 时,semaphore 处于激发状态,当计数器内容等于0 时,semaphore  处于未激发状态。CreateSemaphore() 和OpenSemaphore() 可以传回一个semaphore handle 。


文字版电子书-----请点击这里

0 0
原创粉丝点击