WaitForSingleObject

本文通过两个示例演示了如何使用Windows API中的WaitForSingleObject和WaitForMultipleObjects函数来实现线程间的同步。第一个示例展示了一个主线程等待一个工作线程完成任务的过程;第二个示例展示了如何等待多个线程完成任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

hHandle对象句柄。可以指定一系列的对象,如Event、Job、Memory resource notification、Mutex、Process、
 
Semaphore、Thread、Waitable timer等。
当核心对象有2个状态:激发,未激发,
 
方法返回值:
1:在等待核心对象期间,对象变为激发状态,返回WAIT_OBJECT_0
2:核心对象变成激发状态之前,等待时间结束,返回WAIT_TIMEOUT
3:如果线程没有释放mutex,返回WAIT_ABANDONED
 
#include <iostream>
#include <windows.h> 

using namespace std;
DWORD WINAPI ThreadFun(PVOID par)
{
   cout<<"线程方法正在执行..."<<endl;
   Sleep(3000);
   return 0;
}

int main()
{
    DWORD ThreadID;
    HANDLE hThread=CreateThread(NULL,0,ThreadFun,(void*)0,0,NULL);
    while(TRUE)
    {
       //这里等待时间是设置的1秒钟,可以设置为INFINITE(就不需要外面的死循环了)
       DWORD r= WaitForSingleObject(hThread,1000);
        if(r==WAIT_TIMEOUT)
        {
            cout<<"WAIT_TIMEOUT"<<endl;//输出2-3次
            continue;
        }
        else if(r==WAIT_OBJECT_0)
        {
            cout<<"WAIT_OBJECT_0"<<endl;//线程方法睡眠3秒以后输出
            break;
        }
        else
        {
            cout<<"hello"<<endl;
            continue;
        }
    }
    CloseHandle(hThread);
    system("PAUSE");
    return 0;
}

 

WaitForMultipleObjects

 

#include <iostream>
#include <process.h>
#include <windows.h>

#define ThMax 3//线程数
using namespace std;
unsigned __stdcall ThreadFun(void* par)
{
   cout<<"线程"<<*((int*)par)<<"正在执行..."<<endl;
   Sleep(3000);
   return 0;
}

int main()
{
    HANDLE hThreads[ThMax];
    int par[]={1,2,3};
    int i=0;
    while(TRUE)
    {
       if(i<3)
       {
          hThreads[i]=(HANDLE)_beginthreadex(NULL,0,&ThreadFun,(void*)&(par[i]),0,NULL);
          Sleep(500);
       }
       else
       {
          //详细参考:http://msdn.microsoft.com/en-us/library/ms687025(v=vs.85).aspx
          //bWaitAll参数如果设置为TRUE,那么就必须所有核心对象是激发状态才会返回,FALSE则一个就返回
          DWORD r=WaitForMultipleObjects(3,hThreads,TRUE,1000);
          if(r==WAIT_TIMEOUT)
          {
              cout<<"WAIT_TIMEOUT"<<endl;
              continue;
          }
          else if(r==WAIT_OBJECT_0)
          {
              cout<<"WAIT_OBJECT_0"<<endl;
              break;
          }
          else
          {
              cout<<"等待"<<endl;
              continue;
          }
       }
       i++;
    }
    for(int i=0;i<ThMax;i++)
    {
        CloseHandle(hThreads[i]);
    }
    cout<<"执行完毕"<<endl;
    system("PAUSE");
    return 0;
}

 



本文版权归kennyMc和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

转载于:https://www.cnblogs.com/kennyMc/archive/2012/10/15/2724234.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值