线程同步 事件机制 ManualResetEvent

ManualResetEvent的Reset和Set方法如下:

Reset方法将事件设置为没有信号状态,相当于发出信号时复位信号。

Set方法将事件设置为有信号状态,相当于发出信号。

下面是一个使用ManualResetEvent的具体线程示例:

class Program
{
    static void Main(string[] args)
    {
        static ManualResetEvent evt = new ManualResetEvent(false);

        // 启动生产线程
        Thread producerThread = new Thread(Producer);
        producerThread.Start();

        // 启动消费线程
        Thread consumerThread = new Thread(Consumer);
        consumerThread.Start();

        producerThread.Join();
        consumerThread.Join();
    }

    static void Producer()
    {
        Console.WriteLine("Producer: Start Production");

        // 模拟生产任务
        Thread.Sleep(3000);  

        // 生产完毕,发出信号
        evt.Set();

        Console.WriteLine("Producer: Production Finished");
    }

    static void Consumer()
    {
        Console.WriteLine("Consumer: Waiting for signal");

        // 等待信号
        evt.WaitOne();

        Console.WriteLine("Consumer: Received signal");

        // 模拟消费任务
        Thread.Sleep(1000);

        Console.WriteLine("Consumer: Consumption Finished");

        // 复位信号,供下次循环使用
        evt.Reset();
    }
}

在这个示例中:

  • Producer线程完成生产后,调用evt.Set()发送信号。
  • Consumer线程在evt.WaitOne()等待信号。
  • 收到信号后,Consumer完成消费任务。
  • 在消费结束后,Consumer调用evt.Reset()复位信号,让生产-消费可以进行下一轮循环。

这个示例演示了ManualResetEvent的Set和Reset方法在线程间通信的示例用法。Set发送信号,Reset复位信号,实现生产者-消费者模式中的生产-消费-复位信号循环。