Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 对共享可变状态的易失性访问_C#_Multithreading_Language Agnostic_Volatile_Memory Barriers - Fatal编程技术网

C# 对共享可变状态的易失性访问

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)吗 我觉得答案是肯定的。但似乎。。。过度的 在任何人插话之前,请注意: 这里我不是说线程安全或并发;只是内存一致性。我很清楚,在编写多线程代码时,内存一致性

我认为在没有其他线程同步的情况下,所有对共享可变状态的访问都必须使用某种形式的低级线程安全性(如内存屏障),以避免操作重组(无论是通过编译器、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之前的最后一段)