条件变量是可用于等待条件的同步原语。
它本身并不存在于 .NET 中。但以下链接为根据 SemaphoreSlim、AutoResetEvent 和 Monitor 类实现的条件变量类提供了 100% 的托管代码。它允许线程等待一个条件。并且可以在满足条件时唤醒一个或多个线程。此外,它还支持超时和 CancellationTokens。
要等待一个条件,您编写类似于以下的代码:
object queueLock = new object();
ConditionVariable notEmptyCondition = new ConditionVariable();
T Take() {
lock(queueLock) {
while(queue.Count == 0) {
// wait for queue to be not empty
notEmptyCondition.Wait(queueLock);
}
T item = queue.Dequeue();
if(queue.Count < 100) {
// notify producer queue not full anymore
notFullCondition.Pulse();
}
return item;
}
}
然后在另一个线程中,您可以唤醒一个或多个等待条件的线程。
lock(queueLock) {
//..add item here
notEmptyCondition.Pulse(); // or PulseAll
}