gpt4 book ai didi

c# - 不稳定的怪异

转载 作者:太空狗 更新时间:2023-10-29 17:53:42 26 4
gpt4 key购买 nike

我想大多数人都知道在 Release模式下构建时会发生以下问题(代码取自 Threading in C# ):

static void Main()
{
bool complete = false;

var t = new Thread (() =>
{
bool toggle = false;
while (!complete) toggle = !toggle;
});

t.Start();
Thread.Sleep (1000);

complete = true;
t.Join(); // Blocks indefinitely
}

由于编译器优化缓存了 complete 的值,因此阻止了子线程看到更新后的值。

然而,稍微改变一下上面的代码:

class Wrapper
{
public bool Complete { get; set; }
}

class Test
{
Wrapper wrapper = new Wrapper();

static void Main()
{
var test = new Test();
var t = new Thread(() =>
{
bool toggle = false;
while (!test.wrapper.Complete) toggle = !toggle;
});

t.Start();
Thread.Sleep(1000);

test.wrapper.Complete = true;
t.Join(); // Blocks indefinitely
}
}

在不使用 volatile、内存栅栏或任何其他引入隐式栅栏的机制的情况下解决问题(即子线程能够在 1 秒后退出)。

完成标志的添加封装如何影响它在线程之间的可见性?

最佳答案

我想你的问题已经有了答案:

due to compiler optimizations caching the value of complete and thus preventing the child thread from ever seeing the updated value.

编译器/JIT 优化会在实现有意义/被认为安全且合理的情况下执行。因此,您发现优化未按照您预期的方式执行的情况 - 可能有充分的理由(有人检测到此使用模式并阻止优化)或者它恰好没有被优化(最有可能)。

关于c# - 不稳定的怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14444773/

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