如何通過Queue類實(shí)現(xiàn)C#中的生產(chǎn)者消費(fèi)者模式

c#
小樊
91
2024-08-18 06:40:37
欄目: 編程語言

在C#中,可以通過Queue類實(shí)現(xiàn)生產(chǎn)者消費(fèi)者模式。以下是一個(gè)簡(jiǎn)單的示例代碼:

using System;
using System.Collections;

class Program
{
    static Queue queue = new Queue();
    static int maxSize = 5;

    static void Main()
    {
        // 創(chuàng)建生產(chǎn)者線程和消費(fèi)者線程
        var producer = new System.Threading.Thread(Producer);
        var consumer = new System.Threading.Thread(Consumer);

        producer.Start();
        consumer.Start();
    }

    static void Producer()
    {
        while (true)
        {
            lock (queue)
            {
                // 如果隊(duì)列滿了,生產(chǎn)者等待
                while (queue.Count == maxSize)
                {
                    System.Threading.Monitor.Wait(queue);
                }

                // 生產(chǎn)一個(gè)物品
                int item = new Random().Next(100);
                queue.Enqueue(item);
                Console.WriteLine("生產(chǎn)者生產(chǎn)了物品:" + item);

                // 通知消費(fèi)者可以消費(fèi)了
                System.Threading.Monitor.PulseAll(queue);
            }
        }
    }

    static void Consumer()
    {
        while (true)
        {
            lock (queue)
            {
                // 如果隊(duì)列為空,消費(fèi)者等待
                while (queue.Count == 0)
                {
                    System.Threading.Monitor.Wait(queue);
                }

                // 消費(fèi)一個(gè)物品
                int item = (int)queue.Dequeue();
                Console.WriteLine("消費(fèi)者消費(fèi)了物品:" + item);

                // 通知生產(chǎn)者可以生產(chǎn)了
                System.Threading.Monitor.PulseAll(queue);
            }
        }
    }
}

在上面的示例中,使用Queue類來作為生產(chǎn)者和消費(fèi)者之間的共享資源隊(duì)列。生產(chǎn)者線程不斷生產(chǎn)物品并加入隊(duì)列中,消費(fèi)者線程則不斷從隊(duì)列中取出物品進(jìn)行消費(fèi)。通過使用lock和Monitor來實(shí)現(xiàn)對(duì)隊(duì)列的互斥訪問和條件變量控制。

0