首页 > 其他分享 >AutoResetEvent双向信号(生产者和消费者)例子

AutoResetEvent双向信号(生产者和消费者)例子

时间:2024-10-19 09:21:56浏览次数:1  
标签:Console Thread AutoResetEvent 生产者 static 双向 new message

AutoResetEvent是一个非常有用的线程同步机制,尤其是在处理生产者和消费者问题的时候,尤其适用。本随笔记录下生产者和消费者一对一问题的两种写法并进行代码执行逻辑的分析,来加深对AutoResetEvent的理解。

写法一:

internal class Program
{
    public static AutoResetEvent _product = new AutoResetEvent(false);
    public static AutoResetEvent _customer = new AutoResetEvent(false);

    static string _message = string.Empty;
    static void Main(string[] args)
    {
        Thread Product = new Thread(ProductItems);

        Thread Consume = new Thread(ConsumeItems);


        Product.Start();
        Consume.Start();

        Product.Join();
        Consume.Join();

        Console.WriteLine("finish");
        Console.Read();
    }
    static void ProductItems()
    {
        for (int i = 0; i < 5; i++)
        {
            _product.WaitOne();
            _message = $"~:{i}";
            Console.WriteLine("生产:" + _message);
            _customer.Set();
        }
    }
    static void ConsumeItems()
    {
        for (int i = 0; i < 5; i++)
        {
            _product.Set();
            _customer.WaitOne();
            Console.WriteLine("消费:" + _message);
        }
    }
}

执行结果:

 写法二:

 internal class Program
 {
     public static AutoResetEvent _product = new AutoResetEvent(false);
     public static AutoResetEvent _customer = new AutoResetEvent(true);

     static string _message = string.Empty;
     static void Main(string[] args)
     {
         Thread Product = new Thread(ProductItems);

         Thread Consume = new Thread(ConsumeItems);


         Product.Start();
         Consume.Start();

         Product.Join();
         Consume.Join();

         Console.WriteLine("finish");
         Console.Read();
     }
     static void ProductItems()
     {
         for (int i = 0; i < 5; i++)
         {
             _customer.WaitOne();
             _message = $"~:{i}";
             Console.WriteLine("生产1:" + _message);
             _product.Set();
         }
     }
     static void ConsumeItems()
     {
         for (int i = 0; i < 5; i++)
         {
             _product.WaitOne();
             Console.WriteLine("消费1:" + _message);
             _customer.Set();
         }
     }
 }

运行结果:

 要点:

其一:AutoResetEvent(true)和AutoResetEvent(fasle);两者的区别是前者初始化时就有一个票据,相当于在运行AutoResetEvent(fasle)后,直接调用了set方法。

其二:程序要继续往下运行的条件为:1.必须有票据。2.必须在等待(当然如果没有等待就无所谓生产者和消费者协调问题了,不在本文范围内),两者的顺序可以有先有后,无所谓谁前谁后。

其三:等待句柄对操作系统的负载并不高。

 

标签:Console,Thread,AutoResetEvent,生产者,static,双向,new,message
From: https://www.cnblogs.com/jizhong/p/18474240

相关文章

  • 【教程4>第3章>第22节】基于双向链路的自适应调制解调通信链路FPGA实现1——理论分析研
      欢迎订阅FPGA/MATLAB/Simulink系列教程《★教程1:matlab入门100例》《★教程2:fpga入门100例》《★教程3:simulink入门60例》《★教程4:FPGA/MATLAB/Simulink联合开发入门与进阶X例》目录1.软件版本2.基于双向链路的自适应调制解调通信链路理论分析3.双向链路自......
  • DevEco Studio:Inspector双向预览
    ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(MaoistLearning)➤博客园地址:为敢技术(https://www.cnblogs.com/strengthen/ )➤GitHub地址:https://github.com/strengthen➤原文地址:https://www.cnblogs.com/strengthen/p/......
  • 双向RRT路径搜索算法matlab代码
    一、实现效果见:双向RRT路径搜索算法流程、注意事项-CSDN博客二、代码完整代码见:https://download.csdn.net/download/m0_69611489/89882862clcclearcloseall%%设置环境S=[0.50.5];E=[99.599.5];Limit=[01000100];ob=[5050;7080];ob_r=[15;7];step=1;iu......
  • 生产者消费者c++ 讲解和代码示例
    生产者-消费者问题的C++讲解和代码示例一、问题描述生产者-消费者问题是经典的多线程同步问题,涉及两个类型的线程:生产者线程:负责生成数据并放入共享缓冲区。消费者线程:负责从共享缓冲区取出数据进行处理。关键挑战在于:同步:确保生产者和消费者在访问共享缓冲区时不发生......
  • WPF开发用户控件、用户控件属性依赖DependencyProperty实现双向绑定、以及自定义实现C
    1、新建了一个用户控件,里面画了一个实心圆,以及一个文本控件的组合,当作我要实验使用的用户控件(TestUserControl)。 2、在主窗体里面进行引用,可以看到引用以后,会在工具箱上显示新增的用户控件3、为了测试方便,我直接在先前的Lo'gin页面直接进行添加该用户控件,效果如下。 4、......
  • Spring Boot 集成 RabbitMQ 消息事务(生产者)
    1.SpringBoot集成RabbitMQ消息事务(生产者)1.1.版本说明1.2.概览1.2.1.最大努力单阶段提交模式1.2.2.成功的业务流程1.2.3.失败的业务流程1.3.新建数据库表1.4.Spring配置1.5.定义常量1.6.配置交换机和队列1.7.定义RabbitMQ消息事务管理器1.8.定......
  • 双向栈表
    include<stdio.h>include<stdlib.h>include<stdbool.h>defineMAXSIZE100//定义数组的最大长度typedefstruct{intdata[MAXSIZE];inttop1;//第一个栈的栈顶指针inttop2;//第二个栈的栈顶指针}DoubleStack;//初始化双栈voidinitStack(DoubleStack*s......
  • 我店平台模式:商家与消费者双向探索
    在当今这个数字化时代,消费者的购物体验与商家的经营模式正经历着前所未有的变革。而我店平台,作为这一变革的引领者,正通过一系列创新机制,为商家与消费者搭建起一座互利共赢的桥梁。其中,“金币商城”、“抵用券”、“积分奖励”等机制成为了我店平台上的亮点,不仅让消费者享受到了实......
  • 读者写者与生产者消费者应用场景
    在并发编程中,读写场景和生产者消费者场景是非常经典的两种问题。它们的基本思路和实现方法在许多应用中都可以找到。下面分别介绍这两种场景的一些经典问题及其解决方案。读写场景经典问题多线程访问共享资源:多个线程需要同时读取某个共享数据(例如,配置文件、缓存等),但在某个......
  • linux内核双向链表使用list klist
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、list和klist是什么?二、代码示例1.list2.klist总结前言提示:这里可以添加本文要记录的大概内容:linux内核中大量使用了链表数据结构来存储各种数据,比如device和driver使用klist存储,下......