Visual C++网络编程经典案例详解 第3章 多线程与异步套接字编程 实现线程同步 事件对象 使用API函数操作事件对象

事件对象指用户在程序中使用内核对象的有无信号状态实现线程的同步
使用事件对象实现线程同步编程

#include <windows.h>                            //包含头文件
#include <stdio.h>

DWORD WINAPI myfun1(LPVOID lpParameter);//声明线程函数
DWORD WINAPI myfun2(LPVOID lpParameter);
HANDLE hevent;                                    //定义全局变量hevent
int a=0;                                        //定义全局变量a

int main()
{    
    HANDLE h1,h2;                                    //定义线程句柄
    hevent=::CreateEvent(NULL,false,false,NULL);
    ::SetEvent(hevent);
    h1=::CreateThread(NULL,0,myfun1,NULL,0,NULL);    //创建线程1
    printf("线程1开始运行!\r\n");
    h2=::CreateThread(NULL,0,myfun2,NULL,0,NULL);    //创建线程2
    printf("线程2开始运行!\r\n");
    ::CloseHandle(h1);                                //关闭线程句柄对象
    ::CloseHandle(h2);
    ::Sleep(10000);                                    //程序睡眠10秒
    return 0;
}

DWORD WINAPI myfun1(LPVOID lpParameter)         //线程函数1
{
    while(1)
    {
        ::WaitForSingleObject(hevent,INFINITE);        //请求事件对象
        if(a<10000)
        {
            a+=1;                                            //变量自加
            ::Sleep(1000);                                    //线程睡眠1秒
            printf("线程1:%d\r\n",a);                    //输出变量
            ::SetEvent(hevent);                            //设置事件对象为有信号状态
        }
        else
        {
            ::SetEvent(hevent);                            //设置事件对象为有信号状态
            break;                                        //跳出循环
        }
    }
    return 0;    
}
DWORD WINAPI myfun2(LPVOID lpParameter)         //线程函数2
{
    while(1)
    {
        ::WaitForSingleObject(hevent,INFINITE);        //请求事件对象
        if(a<10000)
        {
            a+=1;
            ::Sleep(1000);
            printf("线程2:%d\r\n",a);                    //输出变量
            ::SetEvent(hevent);
        }
        else
        {
            ::SetEvent(hevent);                            //设置事件对象为有信号状态
            break;                                        //跳出循环
        }
    }
    return 0;                                    //线程正常退出
}

代码中 用户主要使用了函数WaitForSingleObject()对事件对象进行
请求,然后再使用事件对象相关API函数设置其有无信号状态
程序根据事件对象的信号状态判断线程的执行顺序以及输出全局变量a的值

输出
线程1开始运行!
线程2开始运行!
线程1:1
线程2:2
线程1:3
线程2:4
线程1:5
线程2:6
线程1:7
线程2:8
线程1:9
线程2:10
Press any key to continue

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值