防止多线程中的不良优化

本文关键字:不良 优化 多线程 | 更新日期: 2023-09-27 18:28:50

以下代码:

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

可能被优化为

while (true) { ... }

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

然而,根据这三位贡献者的说法,这似乎不是正确的做法(综合声誉超过100万:)

Hans-Passant易失性用法的可复制示例:"永远不要认为它在多线程场景中有用。"

Marc Gravell波动变量的值不;t多线程中的变化:"volatile不是我通常用来保证行为的语义"

Eric Lippert原子性、波动性和不变性是不同的,第三部分:"我不鼓励你制造波动场。"

假设Backgroundworker被像对待任何其他多线程一样对待(而不是有一些内置的机制来阻止优化)-如何防止糟糕的优化?

防止多线程中的不良优化

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

我的观点并不是说波动不会像预期的那样起作用。我的观点是,在两个不同的线程上读写同一个变量首先是个坏主意。如果必须使用volatile来使程序正确,请考虑重新设计程序,使其完全不需要volatile。