gpt4 book ai didi

c# - EventWaitHandle 是否必须处理虚假唤醒?

转载 作者:行者123 更新时间:2023-11-30 16:54:46 31 4
gpt4 key购买 nike

注意:我受限于 .NET 3.5,所以我不能使用 ManualResetEventSlim

我必须处理Spurious wakeups吗?当做这样的事情时:

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 是否需要 volatile 还是​​不必要的?

最佳答案

事件(MRE、ARE 和 slim 版本)没有虚假唤醒。如果这些对象存在这样的问题,几乎所有 Windows 程序都会崩溃。你在和风车搏斗。但是,是的,包括等待和设置事件在内的许多同步功能都执行完整的内存屏障(这很容易理解,但没有记录)。允许虚假唤醒的条件变量(如文档所述)。它们与事件无关。

此外,为什么会有虚假唤醒?从 API 的角度来看没有意义。该事件可以在内部循环并向您隐藏虚假唤醒(实际上,MRESlim 就是这样做的)。我只能重复一遍:几乎所有程序都会中断。那不是现实。

The docs say:

Blocks the current thread until the current WaitHandle receives a signal. The caller of this method blocks indefinitely until the current instance receives a signal.

如果在事件上下文中存在虚假唤醒,这些陈述将是错误的。

您误解了所见。你有一个错误,但它不是由事件引起的。不需要 reallyDone 技术。

关于c# - EventWaitHandle 是否必须处理虚假唤醒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30223042/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com