首页 > 其他分享 >多线程-信号量

多线程-信号量

时间:2024-06-16 23:32:54浏览次数:28  
标签:false AutoResetEvent ManualResetEvent xHL 信号量 线程 多线程 WaitOne

 

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();//释放线程
    }

 

标签:false,AutoResetEvent,ManualResetEvent,xHL,信号量,线程,多线程,WaitOne
From: https://www.cnblogs.com/daiwk/p/18251482

相关文章

  • 多线程处理
    基础知识阻塞与非阻塞阻塞状态指程序未得到所需计算资源时被挂起的状态。程序在等待某操作的过程中,自身不被阻塞,可以继续运行干别的事情,则称该程序在该操作上是非阻塞的。同步与异步不同程序单元为了完成某个任务,在执行过程中需靠某种通信方式以协调一致。例如在购物系统中更......
  • 【JavaEE精炼宝库】多线程(6)线程池
    目录一、线程池的概念及优势1.1线程池的概念:1.2线程池的优势:二、工厂模式三、标准库中的线程池3.1标准库线程池参数解释:3.1.1corePoolSize|maximumPoolSize:3.1.2keepAliveTime|unit:3.1.3workQueue: 3.1.4ThreadFactory: 3.1.5handler:3.2创建线程池演......
  • [转]32th@深入解析C++并发编程:从多线程到现代C++并发库@20240616
    深入解析C++并发编程:从多线程到现代C++并发库你有没有想过,为什么C++在多线程并发编程方面如此强大?C++11标准的发布,为并发编程带来了哪些革命性的变化?本文将深入探讨C++并发编程背后的技术原理,带你领略现代C++并发库的强大之处。文章将结合代码片段,为你揭示C++并发编程的精髓。1.......
  • JAVA多线程实现的三种方式
    1.继承Thread类classExtendThreadextendsThread{//继承自ThreadprivateStringname;publicExtendThread(Stringname){this.name=name;}@Overridepublicvoidrun(){//必须重写run方法,并......
  • (pdf)图解java多线程设计模式.pdf (结城浩)
    书:pan.baidu.com/s/1tGbGhhQ3Ez1SIkqdEREsjQ?pwd=eqp0提取码:eqp0线程基础知识:介绍线程的概念、生命周期、状态转换等基本内容,为后续的多线程设计打下基础。Java线程API:详细讲解Java中线程的创建、启动、控制以及线程间的协作机制,如Thread类、Runnable接口等。线程同步与互斥:......
  • 多线程面试基础篇(面试必备,值得收藏)
    1.并发与并行并行:指两个或多个事件在同一时刻发生(同时执行)。并发:指两个或多个事件在同一个时间段内发生(交替执行)。并发指的是在一段时间内宏观上有多个程序同时运行,微观上这些程序是分时的交替运行在多个CPU系统中,则这些可以并发执行的程序便可以分配到多个处理器上(CPU),......
  • springboot的多线程事务能否保证事务的一致性
    在SpringBoot中,多线程事务的一致性取决于事务管理的配置和实现。SpringFramework本身提供了多种事务管理的方式,如基于注解的声明式事务、编程式事务等。在多线程环境下,要保证事务的一致性需要特别注意以下几点:事务传播属性(TransactionPropagation):在进行多线程事务处理时,需......
  • 11.NiO多线程优化
    场景单线程配合一个selector选择器管理多个channel上的事件。问题1.多核cpu,如果是单线程就会让cpu的力量被浪费。2.单线程处理多个事件,如果某个事件耗费时间比较久,就会影响其它事件的处理。例如:redis单线程写的,底层网络用的类似于nio和selector方式编写,所以缺点就是某个......
  • C++多线程:生产者消费者模式
    文章目录一、模式简介二、头文件、全局变量2.1仓库类的设计2.1.1关于仓库类的分析2.1.2仓库类的设计代码2.2工厂类的设计2.2.1关于工厂类的分析2.2.2工厂类的设计代码a将产品item放到仓库repob将产品item从仓库repo取出c生产者操作d消费者操作2.2.3主函数代......
  • C#等待多线程任务都执行结束
    有时为了快速处理多个任务,同时启用多个线程执行,需要等待都执行结束后再执行后面的方法,实现方法如下:点击查看代码usingSystem;usingSystem.Threading.Tasks;classProgram{staticasyncTaskMain(string[]args){vartask1=Task.Run(()=>DoWork......