zoukankan      html  css  js  c++  java
  • 阻塞队列

    <summary>
        /// 阻塞队列
        /// </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();
            }
        }
  • 相关阅读:
    Sublime text 3支持utf-8
    ubuntu17.10 安装firefox的flash
    opencv mat裁剪
    Ubuntu寻找某某库
    Ubuntu的 g++ gcc版本升降级
    Autotools知识点
    Counted(内存管理机制)
    operator new和operator delete
    STL学习笔记:空间配置器allocator
    function call操作符(operator()) 仿函数(functor)
  • 原文地址:https://www.cnblogs.com/fx2008/p/2258340.html
Copyright © 2011-2022 走看看