我有互斥的例子.CurrentValue- 成员Class
int Class::NextValue()
{
mutex.lock();
++CurrentValue;
++CurrentValue;
int localValue = CurrentValue;
mutex.unlock();
return localValue;
}
Run Code Online (Sandbox Code Playgroud)
我不明白为什么用localValue.下一个代码无法正常工作?
...
mutex.unlock();
return CurrentValue;
Run Code Online (Sandbox Code Playgroud)
如果return不是原子CurrentValue可以在复制构造函数期间更改.但是在第一个代码示例中可以与之相同localValue吗?
问题是return CurrentValue;读取CurrentValue外部互斥锁的保护.这意味着另一个线程可能"同时"写入它.这是数据竞争,因此是未定义的行为.
在任何情况下,代码都应该用RAII正确编写,这个问题甚至不值得考虑.
int Class::NextValue()
{
std::lock_guard<std::mutex> lock(mutex);
++CurrentValue;
++CurrentValue;
return CurrentValue;
}
Run Code Online (Sandbox Code Playgroud)