-2

我有互斥锁的例子。CurrentValue- 成员Class

int Class::NextValue()
{
   mutex.lock();
   ++CurrentValue;
   ++CurrentValue;
   int localValue = CurrentValue;
   mutex.unlock();
   return localValue;
}

我不明白为什么使用localValue. 下一个代码将无法正常工作?

   ...
   mutex.unlock();
   return CurrentValue;

万一return不是原子的CurrentValue,可以在复制构造函数期间更改。但是在第一个代码示例中可以与localValue?

4

2 回答 2

5

问题是在互斥锁的保护之外return CurrentValue;读取。CurrentValue这意味着另一个线程可能正在“同时”写入它。这是一场数据竞赛,因此是未定义的行为。

无论如何,代码应该用RAII正确编写,这个问题甚至不值得考虑。

int Class::NextValue()
{
   std::lock_guard<std::mutex> lock(mutex);
   ++CurrentValue;
   ++CurrentValue;
   return CurrentValue;
}
于 2013-04-19T09:55:06.817 回答
2

CurrentValue可以在调用解锁和函数返回之间由另一个线程更改。但是您真正需要的是互斥锁的范围保护。

C++11:

int Class::NextValue()
{
   std::lock_guard<std::mutex> lock(mutex);
   ++CurrentValue;
   ++CurrentValue;
   return CurrentValue;
} // mutex unlocked on exiting this scope.
于 2013-04-19T09:53:47.837 回答