Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

scope of std::lock_guard inside if block

Currently studying about std::mutex and would love some help. If I've a code that looks like -

....
if(returnBoolValue())
{
    std::lock_guard<std::mutex> lock(mutex_var);
    ....
    ....
}
....

is the std::lock_guard guarding the function returning the value inside if condition? ie. returnBoolValue()

And how should I improve it so that function call is inside the guard as well, if possible?


  • std::mutex - http://en.cppreference.com/w/cpp/thread/mutex
  • std::lock_guard - http://en.cppreference.com/w/cpp/thread/lock_guard
like image 753
Abhinav Gauniyal Avatar asked Nov 30 '22 16:11

Abhinav Gauniyal


2 Answers

Currently it's not possible to do this without adding another scope (C++17 has a way to do this)

A solution would be

....
{
   std::lock_guard<std::mutex> lock(mutex_var);
   if(returnBoolValue())
   {
      ....
      ....
   }
}
....

C++ 17 way:

....
if(std::lock_guard<std::mutex> lock(mutex_var); returnBoolValue())
{
   ....
   ....
}
....
like image 129
Hayt Avatar answered Dec 20 '22 20:12

Hayt


The lock guard locks the mutex when it's constructed: that is, when control flow of your program reaches the declaration of lock. It releases (unlocks) the mutex when the guard is destructed, which happens when control flows through the } terminating the then-block (either by flowing through there naturally, or "forced" by a return, throw, or jump statement).

This of course also shows how you can extend the scope "protected" by the mutex: extend the scope of the lock variable:

{
  std::lock_guard<std::mutex> lock(mutex_var);
  if(returnBoolValue())
  {
    ....
    ....
  }
}

Note that I added an extra block around the "lock + if" pair, to make sure the mutex is unlocked as soon as the if-block finishes.

like image 40
Angew is no longer proud of SO Avatar answered Dec 20 '22 20:12

Angew is no longer proud of SO