• 线程同步(windows平台):事件


    一:介绍

    事件Event实际上是个内核对象,事件分两种状态:激发状态和未激发状态。分两种类型:手动处置事件和自动处置事件。
    手动处置事件被设置为激发状态后,会唤醒所有等待的线程,一直保持为激发状态,直到把它设置为未激发状态。
    自动处置事件被设置为激发状态后,会唤醒一个等待中的线程,然后会自动设置成未激发状态。

    二:函数说明

    创建事件对象:
        HANDLE CreateEvent
        (
          LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全属性
          BOOL bManualReset,     // 指定将事件对象创建成手动复原还是自动复原,true:手动事件;false:自动事件
          BOOL bInitialState, // 初始状态,true:有信号状态; false:无信号状态
          LPCTSTR lpName         // 事件对象名称
        );

    获得事件对象:
        DWORD WaitForSingleObject( 
                HANDLE hHandle,        //事件对象的句柄 
                DWORD dwMilliseconds    //0:测试对象的状态立即返回;INFINITE:对象被触发信号后,函数才会返回
        }

    触发事件:
        BOOL SetEvent(HANDLEhEvent)
        
    将事件设置成未触发:
        BOOL ResetEvent(HANDLEhEvent);

    三:步骤

    自动处置事件步骤:
    1.声明事件对象:Handle hEvent
    2.创建事件对象:CreateEvent(NULL, FALSE, TRUE, NULL)
    3.使用事件对象:WaitForSingleObject(hEvent, INFINITE)
    4.重置事件对象:SetEvent(hEvent)
    5.销毁事件对象:CloseHandle(hEvent)

    手动处置事件步骤:
    1.声明事件对象:Handle hEvent
    2.创建事件对象:CreateEvent(NULL, TRUE, TRUE, NULL)
    3.使用事件对象:WaitForSingleObject(hEvent, INFINITE)
    4.重置为未激活:ResetEvent(hEvent)
    5.重置为激活态:SetEvent(hEvent)
    5.销毁事件对象:CloseHandle(hEvent)

    四:自动处置事件代码实现

     1 /********************************************************
     2 Copyright (C),  2016-2018,
     3 FileName:        t13
     4 Author:            woniu201
     5 Email:             wangpengfei.201@163.com
     6 Created:           2018/10/23
     7 Description:    线程同步-事件
     8 ********************************************************/
     9 #include <iostream>
    10 #include <Windows.h>
    11  
    12 using namespace std;
    13  
    14 volatile int number = 1;
    15 HANDLE hEvent;
    16  
    17 DWORD CALLBACK ThreadFun1(LPVOID pParam)
    18 {
    19     while (1)
    20     {
    21         WaitForSingleObject(hEvent, INFINITE);
    22         cout << "Thread1:" << number++ << endl;
    23         SetEvent(hEvent);
    24         if (number >= 1000)
    25         {
    26             break;
    27         }
    28         
    29     }
    30     return 0;
    31 }
    32  
    33 DWORD CALLBACK ThreadFun2(LPVOID pParam)
    34 {
    35     while (1)
    36     {
    37         WaitForSingleObject(hEvent, INFINITE);
    38         cout << "Thread2:" << number++ << endl;
    39         SetEvent(hEvent);
    40         if (number >= 1000)
    41         {
    42             break;
    43         }
    44     }
    45     return 0;
    46 }
    47  
    48  
    49 int main()
    50 {
    51     //创建自动事件
    52     hEvent = CreateEvent(NULL, false, true, NULL);
    53  
    54     CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL);
    55     CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL);
    56  
    57     getchar();
    58     return 1;
    59 }

    扫码关注公众号

    专注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,在这里一起探讨,一起学习,一起进步,不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。

  • 相关阅读:
    mysql高级查询(转的)
    PHP Content-type 的说明
    在textFieldShouldEndEditing 方法中调用[self.tableView reloadData] 失效问题
    关于navigationcontroller 隐藏navigationBar问题
    iOS证书、签名、安装描述文件
    swift 项目搭建
    定义私有cocoapods 源
    Git 服务器搭建
    UITabelView 介绍
    swift aes 加密
  • 原文地址:https://www.cnblogs.com/woniu201/p/9842805.html
Copyright © 2020-2023  润新知