• c# 阻塞队列


      /// <summary>
        /// 阻塞队列[.net 4.0 貌似自带了阻塞队列]
        /// </summary>
        public class BlockQueue<T>
        {
            public readonly int SizeLimit = 0;
            private Queue<T> _inner_queue = null;
            public int Count
            {
                get { return _inner_queue.Count; }
            }
            private ManualResetEvent _enqueue_wait = null;
            private ManualResetEvent _dequeue_wait = null;
            public BlockQueue(int sizeLimit)
            {
                this.SizeLimit = sizeLimit;
                this._inner_queue = new Queue<T>(this.SizeLimit);
                this._enqueue_wait = new ManualResetEvent(false);
                this._dequeue_wait = new ManualResetEvent(false);
            }
            public void EnQueue(T item)
            {
                if (this._IsShutdown == true) throw new InvalidCastException("Queue was shutdown. Enqueue was not allowed.");
                while (true)
                {
                    lock (this._inner_queue)
                    {
                        if (this._inner_queue.Count < this.SizeLimit)
                        {
                            this._inner_queue.Enqueue(item);
                            this._enqueue_wait.Reset();
                            this._dequeue_wait.Set();
                            break;
                        }
                    }
                    this._enqueue_wait.WaitOne();
                }
            }
            public T DeQueue()
            {
                while (true)
                {
                    if (this._IsShutdown == true)
                    {
                        lock (this._inner_queue) return this._inner_queue.Dequeue();
                    }
                    lock (this._inner_queue)
                    {
                        if (this._inner_queue.Count > 0)
                        {
                            T item = this._inner_queue.Dequeue();
                            this._dequeue_wait.Reset();
                            this._enqueue_wait.Set();
                            return item;
                        }
                    }
                    this._dequeue_wait.WaitOne();
                }
            }
            private bool _IsShutdown = false;
            public void Shutdown()
            {
                this._IsShutdown = true;
                this._dequeue_wait.Set();
            }
        }
  • 相关阅读:
    每日总结3.8
    Go中定时器实现原理及源码解析
    Go语言实现布谷鸟过滤器
    详解Go语言调度循环源码实现
    Go语言中时间轮的实现
    详解Go语言I/O多路复用netpoller模型
    详解Go中内存分配源码实现
    Go中由WaitGroup引发对内存对齐思考
    【分享】java精品实战教程
    nginx实战教程
  • 原文地址:https://www.cnblogs.com/i80386/p/2224967.html
Copyright © 2020-2023  润新知