将锁定while循环使变量不可读

时间:2015-01-28 18:00:02

标签: c# multithreading locking

考虑以下在线程B中运行的代码(即在该线程中运行的所有代码):

    private void KeepValueCurrent(WaitHandle mre)
    {
        while (mre.WaitOne(50))
        {
            var newAddressOffset = LengthOfLastLogEntry;
            if (newAddressOffset > _currentAddressOffset)
            {
                //Only update if new value is larger than existing
                lock(_locker) {_currentAddressOffset = newAddressOffset;}
            }
        }
    }

我是否能够访问线程A中的_currentAddressOffset,如下所示,或者锁定阻止我,因为线程B中的循环运行得如此之快?我的程序有很多其他依赖项,所以我无法单独测试它。

lock (_locker) { currentAddressOffset = _currentAddressOffset; }

注意: _currentAddressOffset是一个全局int变量,带有修饰符volatile以避免任何编译器优化。


更新:后续问题

从收到的答案中我很明显,如果我写给_currentAddressOffset的唯一地方是在线程B的循环中,我不需要锁定int。但是,如果在线程AI中也是如此写入该变量。然后出现竞争条件的概念,我将在线程B中改变我的while循环,直到:

    private void KeepValueCurrent(WaitHandle mre)
    {
        while (mre.WaitOne(50))
        {
            var newAddressOffset = LengthOfLastLogEntry;
            lock(_locker)
            {
                if (newAddressOffset > _currentAddressOffset)
                {
                    //Only update if new value is larger than existing
                    _currentAddressOffset = newAddressOffset;
                }
            }
        }
    }

在线程A中,我现在将读取和写入:

lock (_locker) { currentAddressOffset = _currentAddressOffset; } //Read
lock (_locker) { _currentAddressOffset = newValue; } //Write

在这种情况下是否需要锁定以避免竞争条件?

非常感谢。

1 个答案:

答案 0 :(得分:0)

int的分配已经是原子的,并且已经存在volatile内存障碍。 lock实际上没什么。