Win32学习笔记(12)事件

本文介绍了Win32事件的概念,包括通知类型和线程同步。通过示例代码展示了线程互斥与同步的区别,指出线程同步在避免CPU时间浪费中的重要性,并通过事件对象实现线程的高效同步。
摘要由CSDN通过智能技术生成

1.通知类型:

HANDLE CreateEventA(
  [in, optional] LPSECURITY_ATTRIBUTES lpEventAttributes,//安全描述符
  [in]           BOOL                  bManualReset,//填TRUE通知类型填FALSE互斥
  [in]           BOOL                  bInitialState,//填TRUE有信号填FALSE无信号,信号在互斥体中我们了解过。
  [in, optional] LPCSTR                lpName//随便起个名字
);

下面我们用代买来说明:

#include"stdafx.h"
#include<stdio.h>
#include<Windows.h>
HANDLE Event;
DWORD WINAPI ThreadProc_1(LPVOID lpParameter)
{
​
    TCHAR szBuffer[10] = { 0 };
    //当事件变成已通知时
    WaitForSingleObject(Event, INFINITE);
    //线程执行
    printf("ThreadProc_1执行了\n");
    getchar();
    return 0;
}
DWORD WINAPI ThreadProc_2(LPVOID lpParameter)
{
​
    TCHAR szBuffer[10] = { 0 };
    //当事件变成已通知时
    WaitForSingleObject(Event, INFINITE);
    //线程执行
    printf("ThreadProc_2执行了\n");
    getchar();
    return 0;
}
int main(int argc, char* argv[])
{
    //创建事件
    //四个参数:1.默认安全属性 2.TRUE通知/FALSE互斥 3.初始没信号 4.没有名字
    Event = CreateEventA(NULL, TRUE, FALSE, NULL);
    HANDLE hThread[2];
    //创建连个线程
    hThread[0] = CreateThread(NULL, 0, ThreadProc_1, NULL, 0, NULL);
    hThread[1] = CreateThread(NULL, 0, ThreadProc_2, NULL, 0, NULL);
    //设置事件为已通知(下面这句)
    /*SetEvent(Event);*/  //注意*****我们第一次先把这句屏蔽来看一下输出
    WaitForMultipleObjects(2, hThread, TRUE, INFINITE);
    CloseHandle(hThread[0]);
    CloseHandle(hThread[1]);
    CloseHandle(Event);
    getchar();
    return 0;
}

输出:

发现什么都不输出。这是因为我们把第三个参数写成了FALSE,就是说创建的Event是没有信号的。

接下来我们把上面那句代码加上

输出:

发现输出了,这时因为SetEvent(Event)把Event设置为了有信号的。

这里就有问题了。按照我们之前学习的互斥体中所讲的,两个线程中有任意一个WaitForSingleObject()了那么另一个应该没法执行(我们没有返回“令牌”的代码)这就是因为我们设置为了通知类型,所以两个线程都能执行。具体的原理下面再解释我们先把第二个参数改为FALSE


                
  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wzprabbit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值