zoukankan      html  css  js  c++  java
  • WaitForSingleObject

      在多线程的情况下,有时候我们会希望等待某一线程完成了再继续做其他事情,要实现这个目的,可以使用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 = 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;
    }
     
    void main()
    {
    	cout << i << endl;
    	HANDLE hThread;
    	hThread = CreateThread(NULL, 0, FunProc, NULL, 0, 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");
    }
     
    

      

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

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

    这其中WaitForSingleObject的效果就相当于一个关卡,只有返回给了WaitForSingleObject结果程序才能继续执行,当然线程不一定能正常执行结束,也可能会出现:

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

  • 相关阅读:
    easyExcel入门
    UML-从需求到设计--迭代进化
    UML-操作契约总结
    102. Binary Tree Level Order Traversal
    98. Validate Binary Search Tree
    95. Unique Binary Search Trees II
    96. Unique Binary Search Trees
    94. Binary Tree Inorder Traversal
    84. Largest Rectangle in Histogram
    92. Reverse Linked List II
  • 原文地址:https://www.cnblogs.com/wjcoding/p/11126416.html
Copyright © 2011-2022 走看看