多线程-信号量

news/2024/10/3 19:16:17

 

ManualResetEvent的用法

  1. 初始化:
    • 创建一个ManualResetEvent实例,并设置其初始状态。通常,初始状态可以设置为false(表示事件尚未发生)或true(表示事件已经发生)。例如:ManualResetEvent mre = new ManualResetEvent(false);
  2. 等待事件:
    • 在需要等待事件发生的线程中,调用WaitOne()方法。如果ManualResetEvent的状态为false,该方法会阻塞当前线程,直到状态变为true。例如:mre.WaitOne();
  3. 发出事件:
    • 当某个条件满足或某个事件发生时,通过调用Set()方法来通知等待的线程。这会将ManualResetEvent的状态设置为true,从而允许在WaitOne()处阻塞的线程继续执行。例如:mre.Set();
  4. 重置事件:
    • 如果需要重置ManualResetEvent的状态为false,可以调用Reset()方法。之后,线程在调用WaitOne()时会再次阻塞。例如:mre.Reset();
  5. 多线程通知:
    • 一个重要的特性是,一次Set()调用可以释放所有在WaitOne()上阻塞的线程,这使得ManualResetEvent非常适合用于广播式通知场景。

AutoResetEvent的用法

  1. 初始化:
    • 创建一个AutoResetEvent实例,并设置其初始状态,通常设置为false。例如:AutoResetEvent autoEvent = new AutoResetEvent(false);
  2. 等待事件:
    • 在需要等待事件发生的线程中,调用WaitOne()方法。如果AutoResetEvent的状态为false,线程会在此处阻塞。例如:autoEvent.WaitOne();
  3. 发出事件:
    • 当需要通知等待的线程时,调用Set()方法。这会将AutoResetEvent的状态设置为true,并唤醒一个等待的线程(如果有的话)。状态随后会自动重置为false。例如:autoEvent.Set();
  4. 单线程通知:
    • 与ManualResetEvent不同,AutoResetEvent在唤醒一个线程后会自动将状态重置为false。这意味着每次Set()调用只会唤醒一个线程,使其适合用于一对一的通知场景。

       

//定义
public class XHL
{//一次set释放一个等待的线程public AutoResetEvent autoResetEvent = new AutoResetEvent(false);//一次set释放所有等待的线程public ManualResetEvent manualResetEvent = new ManualResetEvent(false);public void ManualResetEvent(){manualResetEvent.WaitOne();Console.WriteLine("ManualResetEvent");manualResetEvent.Reset();}public void AutoResetEvent(){autoResetEvent.WaitOne();Console.WriteLine("AutoResetEvent");autoResetEvent.Reset();}
}//调用

XHL xHL=new XHL();
Task.Run(() => { xHL.ManualResetEvent(); });
Task.Run(() => { xHL.ManualResetEvent(); });
Task.Run(() => { xHL.ManualResetEvent(); });
Task.Run(() => { xHL.ManualResetEvent(); });
Task.Run(() => { xHL.AutoResetEvent(); });
Task.Run(() => { xHL.AutoResetEvent(); });
Task.Run(() => { xHL.AutoResetEvent(); });
Task.Run(() => { xHL.AutoResetEvent(); });Thread.Sleep(3000);
Console.WriteLine("ManualResetEvent Set");
xHL.manualResetEvent.Set();Thread.Sleep(3000);
Console.WriteLine("AutoResetEvent Set");
xHL.autoResetEvent.Set();

 

Semaphore的用法

Semaphore 是一种同步原语,用于控制对共享资源的访问。它允许多个线程同时访问资源,但限制同时访问的最大线程数。这非常适合于控制对有限资源的并发访问,例如数据库连接池或文件句柄。

Semaphore 类位于 System.Threading 命名空间中,其构造函数通常接受两个参数:初始可用资源和最大可用资源。这两个值可以是相同的,也可以不同,具体取决于你的使用场景。

    //初始化线程个数、最大线程个数static Semaphore semaphore = new Semaphore(3, 3);public static void SleepTask_Semaphore(){semaphore.WaitOne();//等待一个线程Thread.Sleep(100);semaphore.Release();//释放线程}

 

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

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

相关文章

过滤器和拦截器的区别

一、拦截器和过滤器的区别 1、过滤器和拦截器触发时机不一样,过滤器是在请求进入容器后,但请求进入servlet之前进行预处理的。请求结束返回也是,是在servlet处理完后,返回给前端之前。 2、拦截器可以获取IOC容器中的各个bean,而过滤器就不行,因为拦截器是spring提供并管理…

typora快捷键配置

typora高亮快捷键配置 (typora的高亮没有默认快捷键, 需要自己添加) 1.激活高亮功能 偏好设置 → markdown → markdown扩展语法 → 勾选高亮 2.添加快捷键 (原教程可参见官网) 首先可将typra的语言显示换成English, 方便后续定义: 偏好设置 → 通用 → 语言 每个软件, 理论上每…

Elasticsearch 系列(七)- 在ASP.NET Core中使用高级客户端NEST来操作Elasticsearch

本章将和大家分享在ASP.NET Core中如何使用高级客户端NEST来操作我们的Elasticsearch。本章将和大家分享在ASP.NET Core中如何使用高级客户端NEST来操作我们的Elasticsearch。 NEST是一个高级别的Elasticsearch .NET客户端,它仍然非常接近原始Elasticsearch API的映射。所有的…

Perfetto分析进阶

一、Perfetto介绍 Perfetto是Android Q中引入的全新下一代平台级跟踪工具,为Android、Linux和Chrome平台提供了一种通用的性能检测和跟踪分析工具集。其核心是引入了一种全新的用户空间到用户空间的跟踪协议,该协议基于protobuf序列化机制将抓取的数据填充到共享内存缓冲区,…

Kali中MSF利用永恒之蓝(复现)

Kali中MSF利用永恒之蓝(复现) 1、进入MSF框架:2、搜索MS17_010漏洞:这里找到了四个模块:0、1、4是漏洞利用模块;2、3是辅助模块,主要探测主机是否存在MS17_010漏洞。 3、利用Auxiliary辅助探测模块对漏洞进行探测(查看下所需要的参数):4、设置要探测的远程目标(两种…

B - Ticket Counter

B - Ticket Counter https://atcoder.jp/contests/abc358/tasks/abc358_b思路 第i个完成的时刻,done[i] 跟第i-1完成时间done[i-1]有关系, 第i个的开始时刻t[i] 大于 done[i-1], done[i] = t[i]+a第i个的开始时刻t[i] 不大于 done[i-1], done[i] = done[i-1]+aCode https…

使用Kimi+Markmap总结文件内容生成思维导图原创

一份文件内容太长,完整阅读下来太费时间,但如果使用AI进行内容提炼,再总结成思维导图,方便快速看到这份文件的核心内容和主题结构,就会极大地节约时间,目前就可以使用Kimi+Markmap这两个工具,帮我们把ppt、word、pdf等文件内容快速总结成思维导图。 一、工具准备 Kimi,…