注意:我受限于 .NET 3.5,所以我不能使用ManualResetEventSlim
.
做这样的事情时,我是否必须处理虚假唤醒:
var waitHandle = new EventWaitHandle();
new Thread(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(5));
waitHandler.Set();
});
waitHandle.WaitOne();
如果是这样,调用时是否设置了正确的内存屏障Set
和/或WaitOne
这样是安全的:
var reallyDone = false;
var waitHandle = new EventWaitHandle();
new Thread(() =>
{
Thread.Sleep(TimeSpan.FromSeconds(5));
reallyDone = true;
waitHandler.Set();
});
while (!reallyDone)
waitHandle.WaitOne();
reallyDone
特别是,由于指令重新排序或缓存,此示例中的主线程是否可能看不到设置为 true?在这种情况下是否reallyDone
需要易变还是没有必要?