首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在C#中实现生产者/消费者模式

在C#中,生产者/消费者模式是一种常见的多线程设计模式,它可以帮助我们在多线程环境下安全地共享数据。在这种模式下,生产者负责生成数据并将其放入缓冲区,消费者则从缓冲区中获取数据并处理它。以下是一个简单的C#实现生产者/消费者模式的示例:

代码语言:csharp
复制
using System;
using System.Collections.Generic;
using System.Threading;

class Program
{
    static void Main()
    {
        // 创建一个缓冲区,用于存储数据
        Buffer buffer = new Buffer(10);

        // 创建生产者线程
        Thread producerThread = new Thread(() =>
        {
            for (int i = 0; i < 20; i++)
            {
                buffer.Add(i);
                Console.WriteLine($"Produced: {i}");
                Thread.Sleep(100);
            }
        });

        // 创建消费者线程
        Thread consumerThread = new Thread(() =>
        {
            for (int i = 0; i < 20; i++)
            {
                int data = buffer.Get();
                Console.WriteLine($"Consumed: {data}");
                Thread.Sleep(150);
            }
        });

        // 启动生产者和消费者线程
        producerThread.Start();
        consumerThread.Start();

        // 等待线程结束
        producerThread.Join();
        consumerThread.Join();
    }
}

class Buffer
{
    private readonly object _lock = new object();
    private readonly Queue<int> _queue;
    private readonly int _size;

    public Buffer(int size)
    {
        _size = size;
        _queue = new Queue<int>(size);
    }

    public void Add(int data)
    {
        lock (_lock)
        {
            while (_queue.Count >= _size)
            {
                Monitor.Wait(_lock);
            }

            _queue.Enqueue(data);
            Monitor.Pulse(_lock);
        }
    }

    public int Get()
    {
        lock (_lock)
        {
            while (_queue.Count == 0)
            {
                Monitor.Wait(_lock);
            }

            int data = _queue.Dequeue();
            Monitor.Pulse(_lock);
            return data;
        }
    }
}

在这个示例中,我们创建了一个缓冲区类Buffer,它使用了一个队列来存储数据,并使用了Monitor类来实现线程同步。生产者线程不断向缓冲区中添加数据,消费者线程则不断从缓冲区中获取数据并处理它。

这个示例展示了一个简单的生产者/消费者模式,实际应用中可能需要更复杂的实现,例如支持多个生产者和多个消费者,或者支持不同类型的数据。在实际应用中,我们可以使用.NET框架中提供的并行处理库System.Threading.Tasks.Dataflow来实现更高效的生产者/消费者模式。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

关于生产者消费者模式C#实现

C#感觉比MFC和QT好用多了,决定以后除了特殊要求外都用C#开发:)。记录一下用C#实现生产者消费者模式吧。...先介绍一下这个模式,简而言之就是生产者(可能有数个)生产东西,消费者(可能有数个)消费前面生产的东西。...举个生活的例子就是苹果有好几个厂家(生产者)生产iphone,线下线上的购买者(消费者)通过多种途径消耗掉iphone的库存。...再举一个实际开发的例子,我架设了四个摄像头同时不间断拍照,我需要不断的处理得到的图片,这也是生产者消费者模式。 ?...2.按下四个“开始生产”按钮以后,四个生产者不断触发随机数,得到的随机数将使用SaveData函数存入链表尾部(被生产出来的iphone就被两个消费者疯狂买买买,两个文本框就是这两个消费者的购物清单)。

1.3K10

生产者消费者模式

并发编程中使用生产者消费者模式能够解决绝大多数并发问题。该模式通过平衡生产线程和消费线程的工作能力来提高程序的整体处理数据的速度。...在学习一些设计模式的过程,如果先找到这个模式的第三者,能帮助我们快速熟悉一个设计模式生产者消费者模式实战 我和同事一起利用业余时间开发的Yuna工具中使用了生产者消费者模式。...1.0版本我并没有使用生产者消费模式,而是使用单线程来处理, 因为当时只需要处理我们一个部门的邮件,所以单线程明显够用,整个过程是串行执行的。...我们一个长连接服务器中使用了这种模式生产者1负责将所有客户端发送的消息存放在阻塞队列1里,消费者1从队列里读消息,然后通过消息ID进行 hash得到N个队列的一个,然后根据编号将消息存放在到不同的队列里...TYPE_DATA, "{}".getBytes(), (short) 1); messageQueue.put(msg); 线程池与生产消费者模式 Java的线程池类其实就是一种生产者消费者模式实现方式

1.2K10

wait-notify 实现生产者消费者模式

wait 和 nofity 在线程的搭配使用,其实就是生产者消费者的一种应用。...一、为什么要有生产者消费者模式 实际应使用多线程时,线程间的角色并不一完全一样的,有的线程负责生产数据,有的线程负责消费数据。所在就会有一种情况,就是: 生产者生产数据太快,消费者消费能力跟不上。...解决这个问题的思路之一就是:生产者-消费者模式 二、wait、notify 简单应用示例 Wait 类 public class SimpleWaitTest implements Runnable {...simpleWaitTest).start(); Thread.sleep(100); new Thread(simpleNotifyTest).start(); } } 三、生产者消费者模式...做用在于生产者执行完生产任务后,阻塞自己再唤醒消费者进行消费。

18640

如何实现Java并发编程生产者-消费者模式

一、问题描述 Java并发编程生产者-消费者模式是一种经典的多线程通信模式。其主要思想是由一个或多个生产者向共享的数据缓冲区不断生产数据,同时一个或多个消费者从共享的数据缓冲区不断消费数据。...下面将探讨如何实现Java并发编程生产者-消费者模式。 二、解决方案 1、使用BlockingQueue Java提供的BlockingQueue接口非常适合生产者-消费者模式实现。...BlockingQueue是一个线程安全的队列,支持队列为空时阻塞消费者线程和在队列满时阻塞生产者线程。因此,我们可以使用两个线程分别作为生产者消费者,通过BlockingQueue进行数据交换。...消费者线程同理,通过while循环来判断缓冲区是否为空,如果为空则调用wait()方法阻塞等待生产者线程的通知。 三、总结 以下主要介绍了Java并发编程生产者-消费者模式实现。...通过使用BlockingQueue或wait()和notify()方法,可以轻松地实现多线程间的数据交换,提高程序的并发性能。实际开发可以根据具体需求选择适合的方法来实现生产者-消费者模式

13510

C++ 实现多线程生产者消费者模式

之前介绍过 生产者消费者模式,是一种常用的多线程并发设计模式,本文记录 C++ 实现的过程。...该问题描述了两个共享固定大小缓冲区的线程——即所谓的“生产者”和“消费者”——实际运行时会发生的问题。 生产者的主要作用是生成一定量的数据放到缓冲区,然后重复此过程。...单生产者-单消费者模型 单生产者-单消费者模型只有一个生产者和一个消费者生产者不停地往产品库中放入产品,消费者则从产品库取走产品,产品库容积有限制,只能容纳一定数目的产品,如果生产者生产产品的速度过快...producer.join(); consumer.join(); } 单生产者-多消费者模型 与单生产者和单消费者模型不同的是,单生产者-多消费者模型可以允许多个消费者同时从产品库取走产品。...另外也需要保护产品库多个生产者和多个消费者互斥地访问。

2.2K30

Java通过wait和notify来实现生产者消费者模式

今天通过介绍一下如何通过wait和notify来实现生产者消费者模式。 通过synchronized同步代码块实现线程的同步操作,从而保证数据的一致性。下面具体介绍一下这个模式实现过程。...这个执行过程有些人可能会有些疑问,我在这里具体描述一下这整个过程是如何实现的。 在这里因为生产者所休眠的时间比消费者短,所以生产者出现的频率会比消费者高一些。...但是这里需要注意的是并不是生产者调用notify方法,消费者就会马上被唤醒执行接下来的代码。因为唤醒和执行都需要时间,这个过程可能生产者又生成新的产品了吗,也有可能是消费者马上被执行。...这个模式下的生产者消费者主要是通过synchronized 同步代码块来保证product这个变量的一致性。...保证product变量多个线程的调用的过程,线程之间不会发生互相干扰,按正确的顺序执行这些过程。 如果对上面的内容还有什么疑义或者问题都可以加我QQ:208017534咨询。

78090

线程之生产者消费者模式

这篇是第五篇生产者消费者模式我们日常工作中用得非常多,比如:模块解耦、消息队列、分布式场景中都很常见。...生产者不用管消费者的动作,消费者也不用管生产者的动作;它两之间就是通过阻塞队列通信,实现了解耦;阻塞队列的加入,平衡二者能力;生产者只有队列满或消费者只有队列空时才会等待,其他时间谁抢到锁谁工作,提高效率...这就是所谓的等待唤醒机制 先来看看用等待唤醒机制如何实现生产者消费者模式的,首先是阻塞队列: public class MyBlockingQueue { private int maxSize...那么这种方式如何实现生产者消费者模式?...看完前两种方式之后,有些小伙伴可能会说,实现生产者消费者这么烦么?

90320

生产者-消费者模型Hudi的应用

介绍 生产者-消费者模型用于解耦生产者消费者,平衡两者之间的能力不平衡,该模型广泛应用于各个系统,Hudi也使用了该模型控制对记录的处理,即记录会被生产者生产至队列,然后由消费者从队列消费,更具体一点...,对于更新操作,生产者会将文件老的记录放入队列中等待消费者消费,消费后交由HoodieMergeHandle处理;对于插入操作,生产者会将新记录放入队列中等待消费者消费,消费后交由HandleCreateHandle...Hudi定义了BoundedInMemoryQueueProducer接口表示生产者,其子类实现如下 FunctionBasedQueueProducer,基于Function来生产记录,合并日志log...上述便是生产者-消费者Hudi应用的分析。...总结 Hudi采用了生产者-消费者模型来控制记录的处理,与传统多生产者-多消费者模型不同的是,Hudi现在只支持多生产者-单消费者模型,单消费者意味着Hudi暂时不支持文件的并发写入。

57040

并行设计模式--生产者消费者

生产者将生产的数据放入通道,消费者从相应的通道取出数据进行消费,生产者消费者各自的线程,从而使双方的处理互相不影响。...if (c == 0) signalNotEmpty(); } ArrayBlockingQueue,速率的调控是通过生产者唤醒消费者消费者唤醒生产者互相作用来实现的调控。...LinkedBlockingQueue,则是生产者队列未满的情况下唤醒生产者,也就是finally之前的if (c + 1 < capacity) notFull.signal();,消费者队列不为空的时候唤醒消费者...更详细的文章 Java并发包的同步队列SynchronousQueue实现原理 Producer-Consumer的应用实例 生产者消费者模型属于基础模式,其之上的应用非常多,这里举几个常见的例子,方便读者理解...参考 关于生产者消费者模式一个实战的案例 聊聊并发——生产者消费者模式

1.4K30
领券