scope of std::lock_guard inside if block

一个人想着一个人 提交于 2021-02-19 02:37:39

问题


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

回答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

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!