• 阻塞队列


    <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();
            }
        }
  • 相关阅读:
    cout 格式化输出
    CreateEvent的用法
    深入理解CRITICAL_SECTION
    const型类成员
    用 const 限定类的成员函数
    C++文件读写详解(ofstream,ifstream,fstream)
    C++中回调函数(CallBack)的使用
    SetTimer函数的用法
    CString转换成int CString类相应函数
    自己设计并制作了一个自己主动温度控制系统
  • 原文地址:https://www.cnblogs.com/fx2008/p/2258340.html
Copyright © 2020-2023  润新知