提出的问题涉及 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中文网其他相关文章!