1. 程式人生 > >構建線程安全隊列示例

構建線程安全隊列示例

ID enqueue 多個 obj exit 線程安全 eal internal IT

 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 }

構建線程安全隊列示例