首页 > 学院 > 开发设计 > 正文

WaitForSingleObject()函数、WaitForMultipleObject()函数

2019-11-08 18:37:39
字体:
来源:转载
供稿:网友
在多线程下面,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待Object被标为有信号(signaled)时才返回的。那么,什么是信号呢?简单来说,Windows下创建的Object都会被赋予一个状态量。如果Object被激活了,或者正在使用,那么该Object就是无信号,也就是不可用;另一方面,如果Object可用了,那么它就恢复有信号了。

这两个函数的优点是它们在等待的过程中会进入一个非常高效沉睡状态,只占用极少的CPU时间片。(这两个函数都是在内核状态下等待内核对象,不切换到用户模式下,因而效率很高)

WaitForSingleObject()

1. 格式

DWord WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);

有两个参数,分别是THandle和Timeout(毫秒单位)。

如果想要等待一条线程,那么你需要指定线程的Handle,以及相应的Timeout时间。当然,如果你想无限等待下去,Timeout参数可以指定系统常量INFINITE。

2. 使用对象

它可以等待如下几种类型的对象:

Event,Mutex,Semaphore,PRocess,Thread 

3. 返回类型

有三种返回类型:

WAIT_OBJECT_0, 表示等待的对象有信号(对线程来说,表示执行结束);

 WAIT_TIMEOUT, 表示等待指定时间内,对象一直没有信号(线程没执行完);

WAIT_ABANDONED 表示对象有信号,但还是不能执行  一般是因为未获取到锁或其他原因

示例:

[cpp] view plain copyprint?<span style="font-family:Times New Roman;">#include <windows.h>  #include <stdio.h>  #include <iostream.h>    //声明函数  创建线程  DWORD WINAPI FunProc( LPVOID lpParameter);     void main()  {      HANDLE hThread;      hThread=CreateThread(NULL,0,FunProc,NULL,0,NULL);      DWORD dwRet=WaitForSingleObject(hThread, 1);      if(dwRet==WAIT_OBJECT_0)      {          printf("创建的线程执行结束/n");      }      if(dwRet==WAIT_TIMEOUT)      {          printf("等待超时/n");      }      if(dwRet==WAIT_ABANDONED)      {          printf("Abandoned/n");      }      CloseHandle(hThread);  }    DWORD WINAPI FunProc( LPVOID lpParameter )  {         int i=1;      for(; i<1000; i++)      {          printf("%d  ", i);          if(! (i%10))              printf("/n");      }      return 0;  }</span>  
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表