CreateEvent 事件对象可以用来在线程之间同步操作 信号事件

CreateEvent 是一个 Windows API 函数,用于创建或打开一个事件对象,事件对象可以用来在线程之间同步操作。该函数的签名如下:

HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,  // 安全属性,可以为 NULLBOOL bManualReset,                        // 是否为手动重置事件BOOL bInitialState,                       // 事件的初始状态(TRUE 为有信号,FALSE 为无信号)LPCWSTR lpName                            // 事件对象的名称,可以为 NULL
);

参数解释:

  1. lpEventAttributes (安全属性)

    • 指向 SECURITY_ATTRIBUTES 结构的指针,定义事件对象的安全性(如是否可继承)。如果为 NULL,则事件对象将使用默认的安全性设置,并且句柄不可继承。
  2. bManualReset (手动重置)

    • 指定事件对象的重置方式。
      • 如果为 TRUE,事件对象为手动重置,必须通过调用 ResetEvent 函数手动将事件的状态重置为无信号状态。
      • 如果为 FALSE,事件对象为自动重置,当一个等待线程被释放时,系统自动将事件的状态重置为无信号。
  3. bInitialState (初始状态)

    • 指定事件对象的初始状态。
      • 如果为 TRUE,事件对象的初始状态为有信号状态。
      • 如果为 FALSE,事件对象的初始状态为无信号状态。
  4. lpName (事件名称)

    • 指向以 null 结尾的字符串,表示事件对象的名称。如果不需要为事件命名,则可以为 NULL。命名事件对象允许不同进程中的线程通过名字来访问同一个事件对象。

返回值:

  • 成功时,返回事件对象的句柄,失败时返回 NULL。可以通过调用 GetLastError 获取错误信息。

例子

HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);
解释:
  1. NULL: 不需要特殊的安全属性,使用默认设置。
  2. FALSE (自动重置): 事件是自动重置的,这意味着一旦一个等待的线程被唤醒,事件将自动重置为无信号状态,不需要手动调用 ResetEvent
  3. FALSE (初始状态无信号): 事件对象在创建时的状态为无信号状态,意味着线程调用 WaitForSingleObject 时将会阻塞,直到有线程调用 SetEvent 来将事件状态设置为有信号。
  4. NULL: 事件不需要名字,仅在当前进程中使用。

使用场景:

  • 同步线程:比如等待某一线程完成初始化后再继续执行另一个线程的操作。
  • 通知机制:多个线程可以等待同一个事件对象,当事件进入有信号状态时,它们可以根据设计进行不同的操作。

示例:

#include <windows.h>
#include <iostream>int main()
{// 创建一个自动重置的、初始状态为无信号的事件HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);if (hEvent == NULL){std::cerr << "事件创建失败: " << GetLastError() << std::endl;return 1;}// 模拟设置事件为有信号状态std::cout << "设置事件为有信号状态..." << std::endl;SetEvent(hEvent);// 等待事件进入有信号状态WaitForSingleObject(hEvent, INFINITE);std::cout << "事件已被触发,继续执行..." << std::endl;// 关闭事件句柄CloseHandle(hEvent);return 0;
}

在这个例子中,主线程创建了一个自动重置事件,并且将它设置为有信号状态后,再等待该事件的触发。

#include <windows.h>
#include <iostream>int main()
{// 创建一个自动重置的、初始状态为无信号的事件HANDLE hEvent = CreateEvent(NULL, FALSE, FALSE, NULL);if (hEvent == NULL){std::cerr << "事件创建失败: " << GetLastError() << std::endl;return 1;}// 模拟设置事件为有信号状态std::cout << "设置事件为有信号状态..." << std::endl;SetEvent(hEvent);// 等待事件进入有信号状态WaitForSingleObject(hEvent, INFINITE); //自动重置会将hEvent置为无信号状态std::cout << "事件已被触发,继续执行..." << std::endl;//std::cout << "设置事件为有信号状态2..." << std::endl;//SetEvent(hEvent);WaitForSingleObject(hEvent, INFINITE);std::cout << "事件已被触发,继续执行2..." << std::endl;// 关闭事件句柄CloseHandle(hEvent);return 0;
}

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/447595.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用XML实现MyBatis的基础操作

目录 前言 1.准备工作 1.1⽂件配置 1.2添加 mapper 接⼝ 2.增删改查操作 2.1增(Insert) 2.2删(Delete) 2.3改(Update) 2.4查(Select) 前言 接下来我们会使用的数据表如下&#xff1a; 对应的实体类为&#xff1a;UserInfo 所有的准备工作都在如下文章。 MyBatis 操作…

React国际化中英文切换实现

目录 概况 安装 文件结构 引入 使用 正常使用 传参使用 概况 react-intl-universal 是一个国际化库&#xff0c;专门为 React 应用提供多语言支持。与 React 原生的 react-intl 相比&#xff0c;react-intl-universal 支持从远程服务器加载语言包&#xff0c;动态切换语…

MySQL数据的导入

【图书推荐】《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;》-CSDN博客 《MySQL 9从入门到性能优化&#xff08;视频教学版&#xff09;&#xff08;数据库技术丛书&#xff09;》(王英英)【摘要 书评 试读】- 京东图书 (jd.com) MySQL9数据库技术_夏天又到了…

简单使用webpack

下载依赖&#xff1a;npm install webpack webpack-cli --save-dev新建一个目录app。加入html&#xff1a; <html><head><meta charset"utf-8"></head><body><script type"text/javascript" src"./dist/main.js&quo…

05 django管理系统 - 部门管理 - 修改部门

04我们已经实现了新增部门的功能&#xff0c;下面开始修改部门模块的实现。 按道理来说&#xff0c;应该是做成弹框样式的&#xff0c;通过ajax悄咪咪的发数据&#xff0c;然后更新前端数据&#xff0c;但是考虑到实际情况&#xff0c;先用页面跳转的方式实现&#xff0c;后面…

c到c++衔接速成

温馨提示&#xff1a;本篇文章乃博主多次学习后的总结&#xff0c;其中一些专业名词的概念不会做介绍&#xff0c;本篇文章只解决实操问题 c到c中&#xff0c;语法上得到了许多升级&#xff0c;那么哪些地方升级了&#xff0c;我们来快速复习一下 目录 头文件的升级 命名空间…

Android基于gradle task检查各个module之间资源文件冲突情况

做组件化开发的时候&#xff0c;我们经常会遇到各个不同的module之间资源文件冲突的问题&#xff0c;运行也不报错&#xff0c;但是会出现覆盖的问题&#xff0c;导致运行之后发送错误的效果。 所以我们需要利用一个gradlke 脚本task&#xff0c;来自动化检查资源文件冲突。 …

利用 OBS 推送 WEBRTC 流到 smart rtmpd

webrtc whip 推流 & whep 拉流简介 RFC 定义 通用的 webrtc 对于 SDP 协议的交换已经有对应的 RFC 草案出炉了。这就是 WHIP( push stream ) & WHEP ( pull stream ) . WHIP RFC Link: https://www.ietf.org/archive/id/draft-ietf-wish-whip-01.html WHEP RFC Link:…

IRP读写函数

驱动代码&#xff1a; #include <ntddk.h>#define DEVICE_NAME L"\\device\\MyDricer1" //设备对象名称 #define LINK_NAME L"\\dosdevices\\Goose" //符号链接名称VOID UnDirver(PDRIVER_OBJECT pDriverObj) {UNICODE_STRING uLinkName RTL_CONST…

04_实现调度执行

什么是可调度&#xff1f;所谓可调度&#xff0c;指的是当 trigger 动作触发副作用函数重新执行的时候&#xff0c;有能力决定副作用函数执行的时机、次数以及方式 副作用函数执行方式 示例代码&#xff1a; const obj { a: 1 } const objProxy new Proxy(obj, /* ... */)…

02.顺序表、链表简述+对比

目录 一、线性表 二、顺序表 三、链表 四、顺序表和链表的区别 一、线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列&#xff08;相同特性指都为整型int、字符型char或其它类型&#xff09;。 线性表是一种在实际中广泛使用的数据…

雷池社区版配置遇到问题不要慌,查看本文解决

很多新人不太熟悉反向代理&#xff0c;所以导致配置站点出现问题 配置问题 记录常见的配置问题 配置后攻击测试没有拦截记录 检查访问请求有没有真实经过雷池 有很多新人配置站点后&#xff0c;真实的网站流量还是走的源站&#xff0c;导致雷池这边什么数据都没有 配置后…

软考《信息系统运行管理员》- 5.2 信息系统数据资源例行管理

5.2 信息系统数据资源例行管理 文章目录 5.2 信息系统数据资源例行管理数据资源例行管理计划数据资源载体的管理存储介质借用管理存储介质转储管理存储介质销毁管理 数据库例行维护健康检查数据库日志检查数据库一致性检查 数据库监测管理数据库备份与恢复数据库备份与恢复数据…

三子棋(C 语言)

目录 一、游戏设计的整体思路二、各个步骤的代码实现1. 菜单及循环选择的实现2. 棋盘的初始化和显示3. 轮流下棋及结果判断实现4. 结果判断实现 三、所有代码四、总结 一、游戏设计的整体思路 &#xff08;1&#xff09;提供一个菜单让玩家选择人机对战、玩家对战或者退出游戏…

生成式人工智能助长更复杂的网络攻击

网络安全公司 Keeper Security 表示&#xff0c;尽管黑客使用生成式人工智能使网络威胁更加频繁、更加复杂、更难以检测&#xff0c;但许多企业表示对此并未做好准备。 然而&#xff0c;据该公司表示&#xff0c;尽管各组织需要加强防御能力&#xff0c;但他们已经实施的许多基…

从调用NCCL到深入NCCL源码

本小白目前研究GPU多卡互连的方案&#xff0c;主要参考NCCL和RCCL进行学习&#xff0c;如有错误&#xff0c;请及时指正&#xff01; 内容还在整理中&#xff0c;近期不断更新&#xff01;&#xff01; 背景介绍 在大模型高性能计算时会需要用到多卡&#xff08;GPU&#xf…

接口性能测试,这个还真有用啊。

一、概述 性能测试按照不同视角&#xff0c;可以分为以下几类&#xff1a; a. 用户视角的性能 用户角度感受到的网站响应速度的快和慢。从用户在浏览器输入网址/打开应用&#xff0c;到整个页面呈现给用户的耗时。包含了用户端发送请求&#xff0c;服务端收到并执行请求&…

Python和MATLAB及C++和Fortran胶体粒子数学材料学显微镜学微观流变学及光学计算

&#x1f3af;要点 二维成像拥挤胶体粒子检测算法粒子的局部结构和动力学分析椭圆粒子成链动态过程定量分析算法小颗粒的光散射和吸收活跃物质模拟群体行为提取粒子轨迹粘弹性&#xff0c;计算剪切模量计算悬浮液球形粒子多体流体动力学概率规划全息图跟踪和表征粒子位置、大小…

StableDiffusion|833种艺术家风格项目,提示词直接上手! AI绘画文生图直接抄!

大家好&#xff0c;我是画画的小强 众所周知&#xff0c;Stable Diffusion是一个强大的文生图模型&#xff0c;能够根据用户的文本描述生成高质量的图像。在这个过程中&#xff0c;提示词&#xff08;Prompt&#xff09;的选择和构造具有至关重要的作用。提示词是向模型描述你…

强化学习之Q-learning算法

前言&#xff1a; 在正文开始之前&#xff0c;首先给大家介绍一个不错的人工智能学习教程&#xff1a;https://www.captainbed.cn/bbs。其中包含了机器学习、深度学习、强化学习等系列教程&#xff0c;感兴趣的读者可以自行查阅。 一、算法介绍 Q-Learning是一种基于值函数的强…