问题
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/mutexstd::lock_guard
- http://en.cppreference.com/w/cpp/thread/lock_guard
回答1:
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())
{
....
....
}
....
回答2:
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.
回答3:
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.
来源:https://stackoverflow.com/questions/39330745/scope-of-stdlock-guard-inside-if-block