【发布时间】:2011-07-21 22:29:45
【问题描述】:
(我认为)我想要的是 AutoResetEvent 的等价物,多个线程可以等待,所有线程都可以在设置时恢复。
我知道这可以通过为每个线程设置一个 AutoResetEvent 并设置每个线程来实现 - 但有没有更简单的方法?一种不依赖于事件句柄数组的方式?
实际上(我认为)我希望能够做到这一点:
private volatile string state;
private MultiEventHandle stateChanged = new MultiEventHandle();
public void WaitForBlob()
{
while (true)
{
object saved = stateChanged.Current; // some sentinel value
if (state == "Blob") break;
stateChanged.WaitTilNot(saved); // wait til sentinel value != "current"
}
}
public void SetBlob()
{
state = "Blob";
stateChanged.Change(); // stateChanged.Current becomes a new sentinel object
}
即,任意数量的线程都可以调用WaitForBlob,并且在任何时候(没有竞争条件)SetBlob 可以被另一个线程调用,并且所有等待的线程将立即检测到更改 - 重要的是,没有自旋锁或 Threading.Sleeps。
现在我想我可以相对容易地实现“MultiEventHandle”。但我的问题是......有没有更好的方法?我肯定会解决这个问题,因为它一定是一个非常常见的用例,但我似乎无法找到适合这项工作的内置工具。恐怕我要在这里发明一个方轮了..
【问题讨论】:
标签: c# multithreading synchronization