【问题标题】:FIFO Queue improvement for C#C# 的 FIFO 队列改进
【发布时间】:2015-11-25 02:44:35
【问题描述】:

嗨,我正在处理一项任务,我应该实现一个队列来处理等待处理的作业(生产者-消费者问题)。我必须开发一个比先进先出队列更有效的队列。有一些参数描述了饥饿发生前的等待时间,队列结束后需要处理的时间。消费者在指定的时间到达,可以等待指定的时间,当轮到他们时,他们需要一些时间来执行他们想做的任何事情。你能帮我用一个更好的队列而不是先进先出的方法吗?

【问题讨论】:

标签: c# queue fifo


【解决方案1】:

首先你试图同时解决不同的问题,如果你想提高常规队列的性能,你可以实现一个基于元素优先级的队列(堆)如果你想保持常规队列的优先级,您可以根据整数设置优先级,每次将元素添加到堆中时都会增加该数字。

我在这里附上我在谷歌上找到的第一个链接 Priority queue。如果使用Binary Heap,则插入顺序为 O(log n)

现在如果你想实现允许并发的队列,你需要隔离公共资源(例如堆存储元素的基本结构)。

Albahari 是了解生产者-消费者如何处理并发性的一个很好的参考。

这里是你可以用来为生产者-消费者Concurrency sheet实现并发的所有类

我正在添加其中一种类型的示例

 //BlockingCollection with a fix number of Products to put, it works with 10 items max on the collection
    class Program
    {
        private static int counter = 1;
        private static BlockingCollection<Product> products =
            new BlockingCollection<Product>(10);

        static void Main(string[] args)
        {
            //three producers
            Task.Run(() => Producer());
            Task.Run(() => Producer());
            Task.Run(() => Producer());

            Task.Run(() => Consumer());

            Console.ReadLine();
        }

        static void Producer()
        {
            while (true)
            {
                var product = new Product()
                {
                    Number = counter,
                    Name = "Product " + counter++
                };

                //Adding one element
                Console.WriteLine("Producing: " + product);
                products.Add(product);

                Thread.Sleep(2000);
            }
        }

        static void Consumer()
        {
            while (true)
            {
                //wait until exist one element
                if (products.Count == 0)
                    continue;

                var product = products.Take();
                Console.WriteLine("Consuming: " + product);

                Thread.Sleep(2000);
            }
        }
    }

    public class Product
    {
        public int Number { get; set; }
        public string Name { get; set; }

        public override string ToString()
        {
            return Name;
        }
    }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-03
    • 2017-04-12
    • 2019-04-11
    • 1970-01-01
    • 2013-11-15
    • 2010-10-04
    • 1970-01-01
    • 2012-06-12
    相关资源
    最近更新 更多