構建線程安全隊列示例
阿新 • • 發佈:2018-05-12
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 objectm_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 }
構建線程安全隊列示例