【发布时间】:2010-12-31 11:01:28
【问题描述】:
C# 中是否使用了条件变量和监视器?
谁能给我一个例子?
【问题讨论】:
-
除了 lock-statement 和 Monitor 类,还可以查看 WaitHandles (msdn.microsoft.com/en-us/library/…),它非常有用,可以帮助您避免无聊的样板代码。
标签: c# multithreading monitor
C# 中是否使用了条件变量和监视器?
谁能给我一个例子?
【问题讨论】:
标签: c# multithreading monitor
在 .NET 中仅用于信号的条件变量的等价物是抽象的 WaitHandle 类。它的实际实现是 ManualResetEvent 和 AutoResetEvent 类。
用作监视器的条件变量需要 System.Threading.Monitor。 C# lock 语句使其非常易于使用,它确保监视器始终退出而无需显式编程 Exit() 调用。
【讨论】:
WaitHandle 与条件变量相同会导致像stackoverflow.com/questions/18276944/… 这样的误解
此版本在等待信号时自动解锁 Mutex 或 ReaderWriterLockSlim,并在返回之前重新锁定它 - 这是 posix 方式。
using System.Collections.Concurrent;
namespace System.Threading.More {
public class ConditionVariable {
private readonly ConcurrentQueue<ManualResetEventSlim> _waitingThreads = new ConcurrentQueue<ManualResetEventSlim>();
/// <summary>
/// Atomically unlocks and waits for a signal.
/// Then relocks the mutex before returning
/// </summary>
/// <param name="mutex"></param>
public void Wait(Mutex mutex) {
if (mutex == null) {
throw new ArgumentNullException("mutex");
}
var waitHandle = new ManualResetEventSlim();
try {
_waitingThreads.Enqueue(waitHandle);
mutex.ReleaseMutex();
waitHandle.Wait();
} finally {
waitHandle.Dispose();
}
mutex.WaitOne();
}
public void WaitRead(ReaderWriterLockSlim readerWriterLock) {
if (readerWriterLock == null) {
throw new ArgumentNullException("readerWriterLock");
}
var waitHandle = new ManualResetEventSlim();
try {
_waitingThreads.Enqueue(waitHandle);
readerWriterLock.ExitReadLock();
waitHandle.Wait();
} finally {
waitHandle.Dispose();
}
readerWriterLock.EnterReadLock();
}
public void Signal() {
ManualResetEventSlim waitHandle;
if (_waitingThreads.TryDequeue(out waitHandle)) {
waitHandle.Set();
}
}
public void Broadcast() {
ManualResetEventSlim waitHandle;
while (_waitingThreads.TryDequeue(out waitHandle)) {
waitHandle.Set();
}
}
}
}
【讨论】:
作为 ManualResetEvent 和朋友的替代方案,Windows 现在为条件变量提供native support。我自己没有对它进行基准测试,但利用原生 API 时,您的性能很有可能会提高。
这是一篇代码项目文章,解释了如何从 C# 访问这个(相对较新的)构造:
【讨论】:
您可以使用 Lock 对象作为 Monitor 类的语法糖。
lock(someObject)
{
// Thread safe code here.
}
http://msdn.microsoft.com/en-us/library/c5kehkcz%28VS.80%29.aspx
【讨论】:
lock :)
System.Threading.Monitor 是一种方式(内例)
【讨论】: