• C#中ManualResetEvent的Reset,Set,WaitOne


    在C#中,ManualResetEvent是一个用于同步的信号量对象。它允许一个线程等待其他线程的信号,以便在特定条件下继续执行。下面是关于Reset()、Set()和WaitOne()方法的说明:

    1. Reset(): 此方法将ManualResetEvent重置为初始状态,即将其设置为未触发状态。在调用Set()之前,任何等待的线程都将被阻塞,直到再次调用Set()或Reset()。
    2. Set(): 此方法将ManualResetEvent设置为已触发状态,这将导致所有等待的线程被释放并继续执行。如果之前没有线程在等待,则此方法没有任何效果。
    3. WaitOne(): 此方法将当前线程置于等待状态,直到ManualResetEvent被设置为已触发状态。当Set()被调用时,等待的线程将被释放并继续执行。如果ManualResetEvent当前处于未触发状态,则此方法将阻塞当前线程,直到它被设置为已触发状态。

    这些方法在多线程同步中非常有用,它们允许线程之间进行协调和同步,以确保某些条件得到满足后再继续执行。例如,可以使用ManualResetEvent来同步生产者和消费者模式中的线程,以便生产者完成数据生成后消费者可以开始处理数据。

    下面是一个简单的示例代码,演示了如何使用ManualResetEvent:

    using System;  
    using System.Threading;  
      
    class Example  
    {  
        static void Main()  
        {  
            // 创建一个ManualResetEvent对象  
            ManualResetEvent eventObj = new ManualResetEvent(false);  
      
            // 启动一个生产者线程  
            Thread producer = new Thread(() =>  
            {  
                Console.WriteLine("生产者线程开始工作...");  
                // 模拟生产过程  
                Thread.Sleep(2000);  
                Console.WriteLine("生产者线程完成工作...");  
                // 设置ManualResetEvent以释放等待的线程  
                eventObj.Set();  
            });  
      
            // 启动一个消费者线程  
            Thread consumer = new Thread(() =>  
            {  
                Console.WriteLine("消费者线程开始等待...");  
                // 等待ManualResetEvent被设置为已触发状态  
                eventObj.WaitOne();  
                Console.WriteLine("消费者线程继续执行...");  
            });  
      
            // 启动线程  
            producer.Start();  
            consumer.Start();  
      
            // 等待线程结束  
            producer.Join();  
            consumer.Join();  
        }  
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39

    在上面的示例中,生产者线程模拟了一个生产过程,并在完成后使用Set()方法触发ManualResetEvent。消费者线程在开始执行之前使用WaitOne()方法等待ManualResetEvent被设置为已触发状态。这样,生产者线程完成工作后,消费者线程才会继续执行。

  • 相关阅读:
    ProtoBuf的学习和使用(C++)
    iEnglish全国ETP大赛:教育游戏助力英语习得
    653 · 添加运算符
    基于UCOSII的DMA-SPI通信
    Leetcode刷题day1|数组一|704.二分查找,27.移除元素,35.搜索插入位置
    头歌答案--爬虫实战
    什么是供应商管理?供应商管理办法及流程介绍
    安全测试 —— Jmeter 登录接口密码 - rsa加密
    Webpack & 理解 input & output 概念
    Lakehouse架构指南
  • 原文地址:https://blog.csdn.net/weixin_44171249/article/details/134503461