在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用Windows API函数WaitForSingleObject,或者WaitForMultipleObjects。这两个函数都会等待Object被标为有信号(signaled)时才返回的。
那么,信号是什么呢?首先我们可以假设这里存在一个文件和两个线程,我们规定这个文件同一时刻只能被一个线程所访问打开,那么我们的线程该如何知道这个文件现在有没有被别的线程访问呢?我们可以让线程等在一个死循环里,这个循环之一在尝试打开访问这个文件,直到能够打开为止;这样做虽然可以实现目的,但是死循环会占用大量的内存,所以windows就设置了信号量。信号量的作用简单理解就是一个标志位,在我们上述的问题中,这个文件就有一个信号量,初始时我们设信号量为FALSE,而只有当信号量为FALSE时线程才可以打开访问这个文件。那么,当第一个线程到达,信号量为FALSE,线程打开文件进行访问,并将信号量置为TRUE;在第一个线程在访问文件时,第二个线程到来,此时信号量仍未TRUE,所以第二个线程等待,这个等待的过程就是WaitForSingleObject。WaitForSingleObject在等待的过程中会进入一个非常高效的沉睡等待状态,只占用极少的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 表示对象有信号,但还是不能执行  一般是因为未获取到锁或其他原因

代码例如下:

// ConsoleApplication1.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include "stdio.h"
#include "windows.h"
#include <iostream>
using namespace std; int i = ;
DWORD WINAPI FunProc(LPVOID lpParameter); DWORD WINAPI FunProc(LPVOID lpParameter)
{
for (; i < ; i++)
{
if (!(i % ))
cout << endl;
else
cout << i << endl;
}
return ;
} void main()
{
cout << i << endl;
HANDLE hThread;
hThread = CreateThread(NULL, , FunProc, NULL, , NULL);
DWORD dwRet = WaitForSingleObject(hThread, 1);
if (dwRet == WAIT_OBJECT_0)
{
cout<< "创建的线程执行结束" << endl;
}
if (dwRet == WAIT_TIMEOUT)
{
cout<< "等待超时" << endl;
}
if (dwRet == WAIT_ABANDONED)
{
cout<< "Abandoned" << endl;
}
CloseHandle(hThread);
system("pause");
return ;
}

结果为:

这段代码中,首先在开始定义一个变量  i  为  0 ,然后在主函数中先将其输出便有了结果中第一行的  0 。

之后我们开启线程,进入线程函数FunProc,在FunProc中将  i++ 对 10 取余输出,一直到 i > 10 结束循环,线程结束,这时返回给WaitForSingleObject的结果为WAIT_OBJECT_0,表示线程正常结束,并将结果输出。

这其中WaitForSingleObject的效果就相当于一个关卡,只有返回给了WaitForSingleObject结果程序才能继续执行。

这就是未能等到线程结束信号量的等待时间就耗光了。我们也可以将WaitForSingleObject的第二个参数设置为 INFINITE,就可以一直等待。结果为:

参考原文:WaitForSingleObject

其它链接:WaitForSingleObject函数作用和用法

最新文章

  1. Microsoft Orleans 之 入门指南
  2. SpringMVC的Controller中使用线程安全的初始化
  3. debian7 请把标有“Debian GNU/Linux 7.1.0 _Wheezy_ - Official amd64 DVD Binary-1 20130615-23:06”的盘片插入驱动器“/media/cdrom/”再按回车键
  4. python学习-day11-内建函数
  5. js 完成对图片的等比例缩放的方法
  6. Codeforces Gym 100114 H. Milestones 离线树状数组
  7. 大数据笔记10:大数据之Hadoop的MapReduce的原理
  8. 更新cydia“sub-process/usr/libexec/cydia/cydo returned anerror code(2)”是怎么回事?
  9. X-UA-Compatible IE 浏览器默认文档模式设置
  10. 开发板和centos服务器tftp传文件
  11. Python实现翻译功能
  12. [国嵌攻略][143][LCD驱动程序分析]
  13. Visual C++ 6.0中if..else..的简单用法和基本格式
  14. C++使用指针的优点
  15. Oracle创建表空间、用户以及给用户赋权
  16. HDU 1260
  17. mac pro 如何让终端默认运行python3.X而不是2.7
  18. C++赋值兼容原则
  19. 安装plsql developer
  20. 07. pt-fifo-split

热门文章

  1. MySQL中表名重命名
  2. 【Java并发编程】22、Exchanger源码解析(JDK1.7)
  3. HDU5293(SummerTrainingDay13-B Tree DP + 树状数组 + dfs序)
  4. 微信小程序 封装请求
  5. Power BI 与 Azure Analysis Services 的数据关联:3、还原备份文件到Azure Analysis Services
  6. Python&#160;基于python操纵redis入门介绍
  7. Flutter 布局(八)- Stack、IndexedStack、GridView详解
  8. (网页)javaScript增删改查(转)
  9. 前端路由简介以及vue-router实现原理
  10. jquery常用表单操作