考虑以下在线程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
在这种情况下是否需要锁定以避免竞争条件?
非常感谢。
答案 0 :(得分:0)
int
的分配已经是原子的,并且已经存在volatile
内存障碍。 lock
实际上没什么。