当前位置: 首页 > news >正文

c# 线程 AutoResetEvent 的Set()函数多次调用

本文部分内容摘自ChatGPT

在 C# 中,AutoResetEvent 是一种用于线程同步的机制,它的行为类似于一个信号量,主要用于在多线程环境中发出信号并控制线程的执行。AutoResetEvent 的主要特点是每当调用 Set() 方法时,信号会被设置,并唤醒一个等待的线程,然后会自动重置为无信号状态,直到下次调用 Set()

AutoResetEventSet() 方法多次调用的行为

AutoResetEvent 中,调用 Set() 方法的多次行为有特定的规则:

  • 调用 Set() 后,信号会被设置为有信号状态,且会唤醒一个等待的线程。
  • 多次调用 Set():多次调用 Set() 只会唤醒一个等待的线程。调用一次 Set() 后,信号会变为有信号状态,但会自动在唤醒线程后重置为无信号状态。如果在 AutoResetEvent 处于有信号状态时连续调用 Set(),它会再次唤醒一个线程,但是不会导致信号状态保持在有信号状态,除非再次调用 Set()

示例代码

using System;
using System.Threading;class Program
{static AutoResetEvent autoResetEvent = new AutoResetEvent(false);static void ThreadA(){Console.WriteLine("线程A开始等待...");autoResetEvent.WaitOne();  // 等待信号Console.WriteLine("线程A被唤醒");}static void ThreadB(){Console.WriteLine("线程B设置信号");autoResetEvent.Set();  // 唤醒线程AConsole.WriteLine("线程B再次设置信号");autoResetEvent.Set();  // 再次唤醒一个等待的线程(如果有)}static void Main(){Thread threadA = new Thread(ThreadA);Thread threadB = new Thread(ThreadB);threadA.Start();Thread.Sleep(500);  // 确保线程A先开始等待threadB.Start();threadA.Join();threadB.Join();Console.WriteLine("主线程结束");}
}

代码解释:

  1. ThreadA:线程A调用 WaitOne() 等待信号。如果 AutoResetEvent 没有信号,它会被阻塞,直到 Set() 被调用。
  2. ThreadB:线程B首先调用 Set() 唤醒一个等待的线程(这里是线程A)。然后,线程B再次调用 Set(),即使 AutoResetEvent 已经重置为无信号状态,调用 Set() 仍然会唤醒另一个等待的线程(如果存在的话)。

关键点:

  • AutoResetEvent信号状态是自动重置的。即使多次调用 Set(),也只会唤醒一个线程,且每次唤醒线程后信号状态会自动变为无信号。
  • 调用 Set() 多次不会增加等待线程的唤醒次数,每次信号被设置后只会唤醒一个线程,并且信号会立即被重置为无信号。

示例输出:

线程A开始等待...
线程B设置信号
线程A被唤醒
线程B再次设置信号
主线程结束

线程A开始等待... 线程B设置信号 线程A被唤醒 线程B再次设置信号 主线程结束

Set() 多次调用的影响:

  • 如果 AutoResetEvent 已经是有信号状态,调用 Set() 后不会产生任何新的效果,仍然只会唤醒一个等待的线程。
  • 如果没有等待线程,Set() 的调用将没有任何效果,因为没有线程处于等待状态。

总结:

  • AutoResetEventSet() 方法多次调用并不会导致多个线程同时被唤醒。它每次调用时,最多只会唤醒一个线程。信号会在唤醒后自动重置为无信号状态,除非下次调用 Set()
http://www.lryc.cn/news/511336.html

相关文章:

  • 汽车行业的MES系统方案(附案例资料合集)
  • 基于监督学习的神经网络控制算法详细介绍和例程
  • springMVC-请求响应
  • 数据交易和联邦学习的背景下的安全属性
  • 顶顶通呼叫中心中间件mod_cti模块安全增强,预防盗打风险(mod_cti基于FreeSWITCH)
  • Datawhale-AI冬令营二期
  • Python的秘密基地--[章节7] Python 并发与多线程编程
  • 每天五分钟机器学习:凸函数
  • Merry Christmas HTML
  • JavaScript甘特图 dhtmlx-gantt
  • 阿里云-将旧服务器数据与配置完全迁移至新服务器
  • 以EM算法为例介绍坐标上升(Coordinate Ascent)算法:中英双语
  • Spark生态圈
  • CSDN编辑器
  • 【信息系统项目管理师】高分论文:论信息系统项目的资源管理(智慧储电站系统)
  • Web开发:ORM框架之使用Freesql的分表分页写法
  • Unity功能模块一对话系统(1)前置准备
  • strrchr的概念和使用案例
  • 缓存管理自动化:JuiceFS 企业版 Cache Group Operator 新特性发布
  • C++ 并发专题 - 实现一个线程安全的队列
  • SQL 基础教程
  • 【源码】Sharding-JDBC源码分析之SQL中影子库ShadowSQLRouter路由的原理
  • 雷池 WAF 搭配阿里云 CDN 使用教程
  • 3.银河麒麟V10 离线安装Nginx
  • 【模块一】kubernetes容器编排进阶实战之kubernetes 资源限制
  • 【开源】一款基于SpringBoot的智慧小区物业管理系统
  • Goland:专为Go语言设计的高效IDE
  • 云手机与Temu矩阵:跨境电商运营新引擎
  • 仓颉编程笔记1:变量函数定义,常用关键字,实际编写示例
  • Python小括号( )、中括号[ ]和大括号{}代表什么