我有一个类,允许其他线程使用
这个类没有明确的生命周期,因此没有单独的地方可以轻松关闭事件。相反,我想在完成后尽快关闭事件——即在它被信号通知并且任何等待的线程唤醒之后。
出于性能原因,我不想使用锁。
这段代码线程安全吗?能否使其更快?
ManualResetEventSlim
等待它完成操作。这些操作通常很短暂。这个类没有明确的生命周期,因此没有单独的地方可以轻松关闭事件。相反,我想在完成后尽快关闭事件——即在它被信号通知并且任何等待的线程唤醒之后。
出于性能原因,我不想使用锁。
这段代码线程安全吗?能否使其更快?
volatile bool isCompleted;
volatile int waitingCount;
ManualResetEventSlim waiter = new ManualResetEventSlim();
//This method is called on any thread other than the one that calls OnCompleted
public void WaitForCompletion() {
if (isCompleted)
return;
Interlocked.Increment(ref waitingCount);
Thread.MemoryBarrier();
if (!isCompleted)
waiter.Wait();
if (0 == Interlocked.Decrement(ref waitingCount)) {
waiter.Dispose();
waiter = null;
}
return;
}
//This method is called exactly once.
protected internal virtual void OnCompleted(string result) {
Result = result;
isCompleted = true;
Thread.MemoryBarrier();
if (waitingCount == 0) {
waiter.Dispose();
waiter = null;
} else
waiter.Set();
}
Dispose
是安全的。 - user7116ManualResetEventSlim.Dispose
不是线程安全的;同时调用它两次可能不太好。 - SLaksSafeHandle
,以承认它们的关键终结要求(如果您有任何要求的话)。至于像ManualResetEventSlim
这样的同步构造,它似乎不支持自由线程处理。根据定义,它将在多线程环境中使用。但是,正如您所指出的,假设可能是错误的 :) - user7116