以下代码:
while (x == 1) { ... }可能被优化为
while (true) { ... }如果x只在另一个线程中分配。见说明C#中易失性关键字的用法。答案是通过将x设置为volatile来解决这个问题。
然而,根据这三位贡献者的说法,这似乎并不是正确的方法(综合声誉超过100万:)
Hans 可复制的易失性用法示例:“千万不要假设它在多线程场景中很有用。”
Marc Gravell 在多线程中,易失性变量的值不会改变。:“易失性不是我通常用来保证行为的语义”
Eric 原子性、波动性和不变性是不同的,第三部分。:“我不鼓励你做一个不稳定的领域。”
假设一个Backgroundworker像对待任何其他多线程一样(而不是有一些防止优化的内置机制),那么如何防止糟糕的优化呢?
发布于 2013-08-23 13:54:01
你有点曲解了我的立场。使字段易失性将阻止优化。在C#中不破坏易失性。(C++,那是另一个故事。)
我的观点不是说波动不像预期的那样起作用。我的观点是,在两个不同的线程上读取和写入相同的变量首先是个坏主意,。如果你必须使用易失性使你的程序正确,考虑重新设计你的程序,使它根本不需要易失性。
https://stackoverflow.com/questions/18404118
复制相似问题