CLR via C# 讀書筆記 3-4 鎖-條件變量模式
條件變量模式(The Condition variable Pattern)
指的是一個任務(wù)在等待一個變量的狀態(tài).(例如一個線程當(dāng)變量為true的時候執(zhí)行,否則就一直在休眠狀態(tài))
以下代碼演示了Thread1 一直在等待m_condition的狀態(tài)
Thread1在等待狀態(tài)改變的過程中,間歇性的暫時釋放鎖的控制權(quán)
這樣Thread2就有機(jī)會獲得到鎖,改變m_condition的狀態(tài),并且執(zhí)行Pulse(All)方法, 該方法將在執(zhí)行Mointor.Exit(m_lock)的時候喚醒所有等待者,此時等待者發(fā)現(xiàn)狀態(tài)已經(jīng)改變,那么就開始執(zhí)行相應(yīng)的業(yè)務(wù)邏輯
代碼
internal sealed class ConditionVariablePattern
{
private readonly Object m_lock = new Object();
private Boolean m_condition = false;
public void Thread1()
{
Monitor.Enter(m_lock); // Acquire a mutual-exclusive lock
// While under the lock, test the complex condition "atomically"
while (!m_condition)
{
// If condition is not met, wait for another thread to change the condition
Monitor.Wait(m_lock); // Temporarily release lock so other threads can get it
}
// The condition was met, process the data...
Monitor.Exit(m_lock); // Permanently release lock
}
public void Thread2()
{
Monitor.Enter(m_lock); // Acquire a mutual-exclusive lock
// Process data and modify the condition...
m_condition = true;
// Monitor.Pulse(m_lock); // Wakes one waiter AFTER lock is released
Monitor.PulseAll(m_lock); // Wakes all waiters AFTER lock is released
Monitor.Exit(m_lock); // Release lock
}
}
這個模式的好處就是不像自旋鎖(Spin Lock)一樣在等待的過程中浪費(fèi)cpu
自旋鎖通常用于非常短時間的鎖定, 如果長時間鎖定將大量浪費(fèi)cpu
所以稍微長的時間鎖定可以采用條件變量模式
PS1:如果....如果沒人吧條件置為許可的狀態(tài)...那么這線程就永遠(yuǎn)等下去了..直到進(jìn)程被終止的那一天

浙公網(wǎng)安備 33010602011771號