构建线程安全队列示例
1 /// <summary> 2 /// 线程安全的队列 3 /// 允许多个线程对队列入队出队 4 /// 注意:除非有一个可供处理的数据项,否则试图出队一个数据项的线程会一直阻塞 5 /// </summary> 6 /// <typeparam name="T"></typeparam> 7 internal sealed class SynchronizedQueue<T> 8 { 9 //进出队使用同一个锁 10 private readonly object m_lock = new object(); 11 12 private readonly Queue<T> m_queue = new Queue<T>(); 13 14 /// <summary> 15 /// 入队 16 /// </summary> 17 /// <param name="item"></param> 18 public void Enqueue(T item) 19 { 20 Monitor.Enter(m_lock); 21 22 //一个数据项入队 23 m_queue.Enqueue(item); 24 25 //唤醒所有正在等待的线程 26 Monitor.PulseAll(m_lock); 27 28 Monitor.Exit(m_lock); 29 } 30 31 /// <summary> 32 /// 出队 33 /// </summary> 34 /// <returns></returns> 35 public T Dequeue() 36 { 37 Monitor.Enter(m_lock); 38 39 //队列为空就一直循环 40 while (m_queue.Count == 0) 41 { 42 Monitor.Wait(m_lock); 43 } 44 45 //一个数据项出队 46 T item = m_queue.Dequeue(); 47 48 Monitor.Exit(m_lock); 49 50 return item; 51 } 52 }