从Mutex返回值

-2 c++ multithreading mutex

我有互斥的例子.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吗?

R. *_*des 5

问题是return CurrentValue;读取CurrentValue外部互斥锁的保护.这意味着另一个线程可能"同时"写入它.这是数据竞争,因此是未定义的行为.

在任何情况下,代码都应该用RAII正确编写,这个问题甚至不值得考虑.

int Class::NextValue()
{
   std::lock_guard<std::mutex> lock(mutex);
   ++CurrentValue;
   ++CurrentValue;
   return CurrentValue;
}
Run Code Online (Sandbox Code Playgroud)

  • 这是一个局部变量.如果你还不知道那是什么,你不应该搞乱并发代码. (4认同)
  • `localValue`不是共享的,因为它是一个局部变量.没有别的东西可以看到它,更不用说写它了. (2认同)
  • 基本问题是OP没有理解线程是什么:'这意味着每个线程都有单独的调用Stack?'. (2认同)