-2

ミューテックスの例があります。CurrentValue- のメンバーClass

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

が使用される理由がわかりませんlocalValue。次のコードは正しく動作しませんか?

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

whenreturnがアトミックでない場合、CurrentValueコピー コンストラクター中に変更される可能性があります。しかし、最初のコード例では、localValue?

4

2 に答える 2

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 に答える