以下代码:
while (x == 1) { ... }
可能会优化为
while (true) { ... }
如果x
仅在另一个线程中分配。请参阅说明 C# 中 volatile 关键字的用法。那里的答案通过设置x
为来解决这个问题volatile
。
但是,根据这三位贡献者的说法,这似乎不是正确的方法(总声誉超过 100 万 :))
Hans Passant volatile 使用的可重现示例 :“永远不要假设它在多线程场景中有用。”
Marc Gravell volatile 变量的值在多线程中不会改变:“volatile 不是我通常用来保证行为的语义”
Eric Lippert 原子性、易变性和不可变性是不同的,第三部分 :“我不鼓励你创建一个易变的字段。”
假设 aBackgroundworker
被视为任何其他多线程(而不是有一些内置机制来防止优化) - 如何防止糟糕的优化?