构建线程安全队列示例

 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     }

 

posted on 2018-05-12 11:24  庭前花满留晚照  阅读(242)  评论(0编辑  收藏  举报

导航