WaitForSingleObject

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

WaitForSingleObject

  1. DWORD WaitForSingleObject( HANDLE hHandle, DWORDdwMilliseconds);
    有两个参数,分别是THandle和Timeout(毫秒单位)
    如果想要等待一条线程,那么你需要指定线程的Handle,以及相应的Timeout时间
  2. 使用对象
    它可以等待如下几种类型的对象:
    Event,Mutex,Semaphore,Process,Thread
  3. 返回类型
    有三种返回类型:
    WAIT_OBJECT_0, 表示等待的对象有信号(对线程来说,表示执行结束);
    WAIT_TIMEOUT, 表示等待指定时间内,对象一直没有信号(线程没执行完);
    WAIT_ABANDONED 表示对象有信号,但还是不能执行 一般是因为未获取到锁或其他原因;

代码例如下:

#include "stdio.h"
#include "windows.h"
#include <iostream>
using namespace std;

int i = 0;
DWORD WINAPI FunProc(LPVOID lpParameter);

DWORD WINAPI FunProc(LPVOID lpParameter)
{
	for (; i < 10; i++)
	{
		if (!(i % 10))
			cout << endl;
		else
			cout << i << endl;
	}
	return 0;
}

int main()
{
	cout << i << endl;
	HANDLE hThread;
	hThread = CreateThread(NULL, 0, FunProc, NULL, 0, NULL);
	DWORD dwRet = WaitForSingleObject(hThread, 10);
	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 0;
}

输出:
在这里插入图片描述
这段代码中,首先在开始定义一个变量 i 为 0 ,然后在主函数中先将其输出便有了结果中第一行的 0 。之后我们开启线程,进入线程函数FunProc,在FunProc中将 i++ 对 10 取余输出,一直到 i > 10 结束循环,线程结束,这是返回给WaitForSingleObject的结果为WAIT_OBJECT_0,表示线程正常结束,并将结果输出。这其中WaitForSingleObject的效果就相当于一个关卡,只有返回给了WaitForSingleObject结果程序才能继续执行,当然线程不一定能正常执行结束,也可能会出现:
在这里插入图片描述
这就是未能等到线程结束信号量就超时,我们也可以将WaitForSingleObject的第二个参数设置为 INFINITE,就可以一直等待。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值