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

创建一个控制台工程 名字为MFC事件对象
Use MFC in a static Library

CEvent类是MFC中支持事件对象编程的类

CEvent(BOOL bInitiallyOwn = FALSE,BOOL bManualReset = FALSE,LPCTSTR
lpszName = NULL, LPSECURITY_ATTRIBUTES lpsaAttribute = NULL );

bInitiallyOwn表示事件对象的初始状态
如果参数为true 则表示事件对象为有信号状态
否则 事件对象为无信号状态
默认为无信号状态

参数bManualReset表示事件对象是人工重置还是自动重置对象
如果该参数为true,则事件对象为人工重置
否则 事件对象为自动重置

参数lpszName表示用户为该事件对象的命名 默认情况下为NULL

参数lpsaAttribute表示事件对象的安全属性 一般情况下 创建的事件
对象均指定为默认安全属性

#include <afxmt.h>
#include <stdio.h>

DWORD WINAPI myfun1(LPVOID lpParameter);//声明线程函数
DWORD WINAPI myfun2(LPVOID lpParameter);
CEvent event(false,false,NULL,NULL);            //将事件对象定义为全局变量
int a=0;                                        //定义全局变量a

int main()
{    
    HANDLE h1,h2;                                    //定义线程句柄
    event.SetEvent();
    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(event.m_hObject,INFINITE);    //请求事件对象
        //event.ResetEvent();                            //设置事件对象为无信号状态
        if(a<10000)
        {
            a+=1;                                            //变量自加
            ::Sleep(1000);                                    //线程睡眠1秒
            printf("线程1:%d\r\n",a);                    //输出变量
            event.SetEvent();                            //设置事件对象为有信号状态
        }
        else
        {
            event.SetEvent();                                //设置事件对象为有信号状态
            break;                                        //跳出循环
        }
    }
    return 0;                                    //线程
}
DWORD WINAPI myfun2(LPVOID lpParameter)         //线程函数2
{
    while(1)
    {
        ::WaitForSingleObject(event.m_hObject,INFINITE);    //请求事件对象
        //event.ResetEvent();                            //设置事件对象为无信号状态
        if(a<10000)
        {
            a+=1;
            ::Sleep(1000);
            printf("线程2:%d\r\n",a);                    //输出变量
            event.SetEvent();
        }
        else
        {
            event.SetEvent();                            //设置事件对象为有信号状态
            break;                                        //跳出循环
        }
    }
    return 0;                                    //线程正常退出
}


输出
线程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

CEvent类实现线程同步

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值