C# 对共享可变状态的易失性访问
我认为在没有其他线程同步的情况下,所有对共享可变状态的访问都必须使用某种形式的低级线程安全性(如内存屏障),以避免操作重组(无论是通过编译器、JIT还是CPU) 例如,在C#中,我必须在不使用任何其他同步的地方使用Volatile.Read(ref-someVar)和Volatile.Write(ref-someVar,someValue)吗 我觉得答案是肯定的。但似乎。。。过度的C# 对共享可变状态的易失性访问,c#,multithreading,language-agnostic,volatile,memory-barriers,C#,Multithreading,Language Agnostic,Volatile,Memory Barriers,我认为在没有其他线程同步的情况下,所有对共享可变状态的访问都必须使用某种形式的低级线程安全性(如内存屏障),以避免操作重组(无论是通过编译器、JIT还是CPU) 例如,在C#中,我必须在不使用任何其他同步的地方使用Volatile.Read(ref-someVar)和Volatile.Write(ref-someVar,someValue)吗 我觉得答案是肯定的。但似乎。。。过度的 在任何人插话之前,请注意: 这里我不是说线程安全或并发;只是内存一致性。我很清楚,在编写多线程代码时,内存一致性
在任何人插话之前,请注意:
这里我不是说线程安全或并发;只是内存一致性。我很清楚,在编写多线程代码时,内存一致性并不是唯一需要考虑的问题。首先,如果您声明变量为volatile,您可以正常地读/写它们并获得内存障碍 对于实际问题:取决于如何定义“内存一致性”。根据您的用例,您不必同步每次写入/读取,您可以只使用一个,以确保同时发布多个内容:
// T1:
foo = 5 // non-volatile
bar = 7 // non-volatile
done = True // volatile write
// T2:
if (done) { // volatile read
foo and bar guaranteed to be 5, respectively 7 with non-volatile reads
}
但是是的,您仍然需要每个线程至少有一个内存屏障,否则您的代码将是“错误的”。但这取决于你如何定义“错误”
我能想到的一个(唯一真正的)例子是没有内存保证的轻松CAS,它允许实现不删除更新和不强制排序的性能计数器。有关该特定想法的来源,请参见(build.java之前的最后一段)