首页 >后端开发 >C++ >C# 线程能否缓存布尔值,而忽略其他线程的更新?

C# 线程能否缓存布尔值,而忽略其他线程的更新?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-03 02:52:38729浏览

Can a C# Thread Cache a Boolean Value, Ignoring Updates from Other Threads?

C# 线程可以缓存值并忽略其他线程上的更改吗?

提出的问题涉及 C# 线程在读取另一个线程上修改的 bool 值时的行为线。一些文章表明读取线程可能会缓存旧值,从而可能导致无限循环。

理解问题

虽然为了线程安全而锁定变量是一个很好的做法,但 .NET运行时旨在抽象出与易失性内存相关的问题。然而,根据该领域的专家的说法,规范并不能保证所提供示例中观察到的行为。

潜在的错误行为

示例代码呈现了一个在之间共享的布尔值(停止)两个线程。一个线程在 5 秒延迟后将该值设置为 true,而另一个线程在循环中不断读取该值。理论上,如果没有适当的同步(例如锁),读取线程可能会缓存初始假值并且永远不会读取更新后的真值。

反示例

尽管在文章中,已经演示了一个可重复的反例:

// using System.Threading;

private static bool stopping = false; // Make volatile to fix the issue

static void DoWork()
{
    int i = 0;
    while (!stopping)
    {
        i++;
    }

    Console.WriteLine("DoWork exit " + i);
}

在这种情况下,将stopping设置为true后,DoWork线程继续无限期地运行,表明旧值正在被缓存。

解决方案

为了确保正确的行为,将共享变量标记为易失性至关重要,这会增加内存屏障并阻止优化这可能会导致缓存。或者,使用锁来同步对变量的访问也可以解决该问题。

以上是C# 线程能否缓存布尔值,而忽略其他线程的更新?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn