【问题标题】:cached variables using lock and volatile使用 lock 和 volatile 缓存变量
【发布时间】:2014-06-19 10:47:48
【问题描述】:

锁是否强制变量直接写入内存,而不是像 volatile 那样被缓存?在this question Orion Edwards 中指出使用锁比使用 volatile 更好,但是如果从锁内访问公共变量,并且总是从该锁访问,这是否意味着它永远不会在该锁语句之外缓存?

private readonly object locker = new object();
private bool? _Var = null;

public bool? Var
{
    get 
    {
        lock (locker)
        {
            //possibly get the variable _Var in cache memory somewhere
            return this._Var;
            //force _Var back to memory
        }
    }
    set 
    {
        lock (locker)
        {
            //possibly get the variable _Var in cache memory somewhere
            this._Var = value;
            //force _Var back to memory
        }
    }
}

【问题讨论】:

    标签: c# locking volatile


    【解决方案1】:

    锁在它的第一条指令之前引入了一个获取栅栏,在它的最后一条指令之后引入了一个释放栅栏。

    acquire-fence 防止锁内的指令及时向后移动并高于锁(即“缓存”)。 (另外,请注意它不会阻止锁上方的指令在锁内移动)。

    这是规范所保证的。用于实现这一点的机制(例如,阻止处理器使用寄存器和直接向/从内存写入/读取、缓存无效等)并不相关。

    【讨论】:

    • 好的,如果我是正确的,锁会保护 _Var 变量,正如我在代码中描述的那样?在这个例子中使用锁是否安全?
    猜你喜欢
    • 2011-12-13
    • 2017-11-25
    • 1970-01-01
    • 2014-08-12
    • 2015-07-20
    • 1970-01-01
    相关资源
    最近更新 更多