相关疑难解决方法(0)

易失性字段:如何实际获取字段的最新写入值?

考虑以下示例:

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之外不能输出任何东西.

但是,我现在的理解是:

  • Volatile.Write()发出一个发布栏.这意味着在分配1到之后,可能不会发生先前的加载或存储(按程序顺序).sharedState
  • Volatile.Read()发出一个获取围栏.这意味着,没有后续的加载或存储(按程序顺序)可以的复制之前发生sharedStatesharedStateSnapshot.

或者,换句话说:

  • sharedState实际发布到所有处理器核心时,该写入之前的所有内容也将被释放,并且,
  • sharedStateSnapshot获取地址中的值时; sharedState一定是已经被收购了.

如果我的理解是正确的,那么sharedState如果写入FirstThread()还没有被释放,那么没有什么可以防止获得"陈旧" .

如果这是真的,我们如何才能真正确保(假设最弱的处理器内存模型,如ARM或Alpha),程序将始终打印1?(或者我在某个地方的心理模型中犯了错误?)

.net c# multithreading volatile .net-4.5

7
推荐指数
1
解决办法
878
查看次数

标签 统计

.net ×1

.net-4.5 ×1

c# ×1

multithreading ×1

volatile ×1