Abhinav Gauniyal
Abhinav Gauniyal

Reputation: 7574

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?


Upvotes: 5

Views: 10052

Answers (3)

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.

Upvotes: 6

Hayt
Hayt

Reputation: 5370

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())
{
   ....
   ....
}
....

Upvotes: 11

eerorika
eerorika

Reputation: 238311

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

No. The critical section begins at the point of declaration of the guard. The guard is declared after the condition - so it is not guarded.

And how should I improve it

If you need the condition to be guarded as well, then move the guard before the if statement.

Upvotes: 2

Related Questions