ManualResetEventManualResetEventSlim

news/2024/10/19 22:07:27

ManualResetEvent

ManualResetEvent有三个重要的方法,分别为:waiteone(),set(),reset(),其含义如下:

1.WaitOne()即等待信号发出,即可往下运行。

2.set()发出信号,让线程方法继续往下运行,并允许其他线程(如有)一并往下运行。

3.reset()重新初始化(即:去掉票据)变为ManualResetEvent(false)形式。

官方示例如下:

internal class Program
{private static ManualResetEvent mre = new ManualResetEvent(false);static void Main(){Console.WriteLine("\n初始化3个线程,并在遇到waitone时阻塞运行:\n");for (int i = 0; i <= 2; i++){Thread t = new Thread(ThreadProc);t.Name = "Thread_" + i;t.Start();}Thread.Sleep(500);Console.WriteLine("\n三个线程已经启动,请按回车键调用Set()方法来释放3个阻塞线程");Console.ReadLine();mre.Set();Thread.Sleep(500);Console.WriteLine("\n当这个ManualResetEvent活得信号,3个线程都会从WaitOne()方法内返回,并继续运行(如果有新线程被创建)不会被阻塞,可按回车键进行观察:\n");Console.ReadLine();for (int i = 3; i <= 4; i++){Thread t = new Thread(ThreadProc);t.Name = "Thread_" + i;t.Start();}Thread.Sleep(500);Console.WriteLine("\n按回车键调用 Reset()方法(设置为无信号状态),重新初始化一个线程运行,并在WaitOne()方法处停下来\n");Console.ReadLine();mre.Reset();// Start a thread that waits on the ManualResetEvent.Thread t5 = new Thread(ThreadProc);t5.Name = "Thread_5";t5.Start();Thread.Sleep(500);Console.WriteLine("\n按回车键调用 Set() 方法,然后结束演示.");Console.ReadLine();mre.Set();Console.ReadLine();}private static void ThreadProc(){string name = Thread.CurrentThread.Name;Console.WriteLine(name + " starts and calls mre.WaitOne()");mre.WaitOne();Console.WriteLine(name + " ends.");}
}

运行结果:

ManualResetEventSlim:

ManualResetEventSlim是ManualResetEvent的简化版或者叫优化版,其主要原理为采用了自旋方式来提高性能,适用于短期内等待的情况,性能比后者要好很多。适用于一次写入,多次读取时候的线程同步场景。

官方示例代码:

 internal class Program{static void Main(string[] args){MRES_SetWaitReset();Console.ReadKey();}static void MRES_SetWaitReset(){ManualResetEventSlim mres1 = new ManualResetEventSlim(false);ManualResetEventSlim mres2 = new ManualResetEventSlim(false);ManualResetEventSlim mres3 = new ManualResetEventSlim(true); var observer = Task.Factory.StartNew(() =>{mres1.Wait();Console.WriteLine("mres1!阻塞结束继续运行");Console.WriteLine("mres3即将被重置");mres3.Reset(); Console.WriteLine("mres2即将获取到票据");mres2.Set();});Console.WriteLine("主线程: mres3.IsSet = {0} (should be true)", mres3.IsSet);Console.WriteLine("主线程:mres1即将获取信号");mres1.Set();Console.WriteLine("主线程:mres2即将阻塞");mres2.Wait();Console.WriteLine("主线程:mres2已获取信号!");Console.WriteLine("主线程: mres3.IsSet = {0} (should be false)", mres3.IsSet);observer.Wait(); // make sure that this has fully completed
         mres1.Dispose();mres2.Dispose();mres3.Dispose();}}

运行结果:

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

golang项目引用GitHub私有仓库module

1.创建go module项目module的名字假设为go-testmodule项目创建成功后,将go.mod文件中的 module "go-test" 修改成module "github.com/tonglin0325/go-test"避免引用的时候go get的时候报错,如下go get github.com/tonglin0325/go-test@latest go: github…

时序约束和综合+跨时钟产生的问题+spyglass的使用+SOC设计问题

时序约束和综合 时钟频率 # 时钟单位为ns,2ns对应500M时钟频率 create_clock -period 2 [get ports clk]skew # 设置时钟的skew,即上升沿之间的误差,当前设置为0.3ns set_clock_uncertainty -setup 0.3 [get_clocks CLK]transition # 设置时钟上升沿的转化时间 set_clock_tr…

java锁的问题速通

1.syncronized底层原理——悲观锁 synchronized有对象锁和类锁两种,多个线程中只有一个线程可以获取对象锁,其他线程都会处于阻塞状态 synchronized是底层是基于monitor实现的。monitor是C++编写的jvm对象,主要分为owner(这个只会存一个线程的信息,记录当前锁被哪个线程获…

PbootCMS登录请求发生错误

PbootCMS登录请求发生错误排查步骤删除runtime目录进入PbootCMS的根目录。 找到并删除runtime目录。 刷新页面后重新尝试登录。检查会话文件存储目录的写入权限确认data/session目录存在且具有写入权限。 可以通过FTP或服务器管理工具检查和修改目录权限,确保Web服务器用户(如…

征程 6E DISPLAY 功能介绍及上手实践

01 功能概述 本文将带大家一起实现单路、多路 MIPI CSI TX 输出、IDU 回写、IDU oneshot 模式、绑定输出 VPS 数据等功能,此处主要介绍各 sample 的实现与使用方法。 02 软件架构说明 本文中绑定 VPS 输出功能基于 libvio API 实现,调用 libvio 提供的 API,同时通过配置文件…

The 2022 ICPC Asia Nanjing Regional Contest IGDA,和令人疑惑的M

The 2022 ICPC Asia Nanjing Regional Contest IGDA,和令人疑惑的MI - 完美回文 题意 把单词改成一串相同的字母,最小修改次数 思路 把所有字母改成这个单词中出现次数最多的字母 代码 #include <bits/stdc++.h> using namespace std;void solve() {string s;map<cha…

fastStone Capture截图神器,你想要的功能它都有!

前言 大家好,我是小徐啊。从今天开始,小徐将介绍很多Java开发领域相关的软件工具资源,欢迎大家关注。今天,介绍一款非常小巧,但功能十分强大的图片软件,fastStone Capture。这款工具,主要是图片的截图,编辑,以及屏幕录屏等功能,可以说非常强大了。文末附获取方式。 安…

低功耗4G模组:LCD应用示例

​ 今天我们学习合宙Air780E开发板LCD应用示例,文末【阅读原文】获取最新资料。本文档适用于Air780E开发板关联文档和使用工具lcd-demo: https://gitee.com/openLuat/LuatOS/tree/master/demo/lcdLuatools下载调试工具一、环境准备 1.1 Air780E开发板一套​1.2 屏幕一个 这里…