考虑以下示例:
private int sharedState = 0;
private void FirstThread() {
Volatile.Write(ref sharedState, 1);
}
private void SecondThread() {
int sharedStateSnapshot = Volatile.Read(ref sharedState);
Console.WriteLine(sharedStateSnapshot);
}
Run Code Online (Sandbox Code Playgroud)
直到最近,我的印象是,只要FirstThread()真的执行过SecondThread(),这个程序除了1之外不能输出任何东西.
但是,我现在的理解是:
sharedStatesharedState到sharedStateSnapshot.或者,换句话说:
sharedState实际发布到所有处理器核心时,该写入之前的所有内容也将被释放,并且,sharedStateSnapshot获取地址中的值时; sharedState一定是已经被收购了.如果我的理解是正确的,那么sharedState如果写入FirstThread()还没有被释放,那么没有什么可以防止获得"陈旧" .
如果这是真的,我们如何才能真正确保(假设最弱的处理器内存模型,如ARM或Alpha),程序将始终打印1?(或者我在某个地方的心理模型中犯了错误?)