5

以下代码:

while (x == 1) { ... }

可能会优化为

while (true) { ... }

如果x仅在另一个线程中分配。请参阅说明 C# 中 volatile 关键字的用法。那里的答案通过设置x为来解决这个问题volatile

但是,根据这三位贡献者的说法,这似乎不是正确的方法(总声誉超过 100 万 :))

Hans Passant volatile 使用的可重现示例 :“永远不要假设它在多线程场景中有用。”

Marc Gravell volatile 变量的值在多线程中不会改变:“volatile 不是我通常用来保证行为的语义”

Eric Lippert 原子性、易变性和不可变性是不同的,第三部分 :“我不鼓励你创建一个易变的字段。”

假设 aBackgroundworker被视为任何其他多线程(而不是有一些内置机制来防止优化) - 如何防止糟糕的优化?

4

1 回答 1

13

你稍微曲解了我的立场。使字段不稳定阻止优化。易失性在 C# 中没有被破坏。(C++,那是另一回事了。)

我的观点不是 volatile 不能按预期工作。我的观点是,在两个不同的线程上读取和写入相同的变量首先是一个坏主意。如果您必须使用 volatile 使您的程序正确,请考虑重新设计您的程序,使其根本不需要 volatile。

于 2013-08-23T13:54:01.760 回答