條件變量模式-讓線程根據條件執行
阿新 • • 發佈:2018-05-12
阻塞 其它 互斥 clas cpu enter bsp pat 自己
1 /// <summary> 2 /// 條件變量模式 3 /// 讓線程根據條件執行 4 /// </summary> 5 public sealed class ConditionVariablePattern 6 { 7 //兩個線程使用同一個鎖 8 private readonly object m_lock = new object(); 9 10 //復合條件(此處只是簡單的Boolean類型) 11 private bool m_condition = false; 12 13 public void Thread1() 14 { 15 //在指定對象上獲取排他鎖 16 Monitor.Enter(m_lock); 17 18 //在鎖中原子性的測試復合條件 19 //條件不滿足時 20 while (!m_condition) 21 { 22 //臨時釋放鎖,使其它線程能夠獲取它 23 //等待另一個線程更改條件 24 //釋放對象上的鎖並阻止當前線程,直到它重新獲取該鎖 25 Monitor.Wait(m_lock); 26 } 27 28 //走到這裏表示條件滿足,可以處理自己的業務 29 30 //永久釋放鎖 31 Monitor.Exit(m_lock); 32 } 33 34 public void Thread2() 35 { 36 //獲取一個互斥鎖 37 Monitor.Enter(m_lock);38 39 //處理業務數據,修改條件 40 m_condition = true; 41 42 //解除線程阻塞可能會浪費一些CPU時間 43 //通知等待隊列中的線程鎖定對象狀態的更改 44 //即釋放鎖之後喚醒一個正在等待的線程 45 //Monitor.Pulse(m_lock); 46 47 //解除線程阻塞可能會浪費一些CPU時間 48 //通知所有的等待線程對象狀態的更改 49 //即釋放鎖之後喚醒所有正在等待的線程 50 Monitor.PulseAll(m_lock); 51 52 //釋放鎖 53 Monitor.Exit(m_lock); 54 } 55 }
條件變量模式-讓線程根據條件執行