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 }