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
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())
{
....
....
}
....
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With