• 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");
    return 0;
    }

    结果为:

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

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

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

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


    参考原文:WaitForSingleObject

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

  • 相关阅读:
    Codevs 2296 仪仗队 2008年省队选拔赛山东
    Codevs 1535 封锁阳光大学
    Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
    Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
    Codevs 1684 垃圾陷阱
    洛谷 P1108 低价购买
    Vijos P1325桐桐的糖果计划
    Codevs 3289 花匠 2013年NOIP全国联赛提高组
    Codevs 2611 观光旅游(floyed最小环)
    C语言基础之彩色版C语言(内含linux)
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/10170733.html
Copyright © 2020-2023  润新知