如果块阻止std :: lock_guard的范围

时间:2016-09-05 12:34:36

标签: c++ multithreading c++11 mutex

目前正在研究std::mutex并希望得到一些帮助。如果我的代码看起来像 -

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

std::lock_guard守护函数,如果条件返回值?即。 returnBoolValue()

如果可能的话,我应该如何改进它以便函数调用也在内部?

3 个答案:

答案 0 :(得分:8)

目前,如果不添加另一个范围,就无法做到这一点(C ++ 17有办法做到这一点)

解决方案是

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

C ++ 17方式:

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

答案 1 :(得分:5)

锁定保护程序在构造时锁定互斥锁:即,当程序的控制流程达到lock的声明时。当守卫被破坏时,它释放(解锁)互斥锁,这发生在控制流经}终止当时阻塞时(通过自然流过那里,或者#34;强制&#34;由{ {1}},return或跳转语句。

这当然也说明了如何扩大范围&#34; protected&#34;通过互斥锁:扩展throw变量的范围:

lock

请注意,我在&#34; { std::lock_guard<std::mutex> lock(mutex_var); if(returnBoolValue()) { .... .... } } + lock&#34;周围添加了一个额外的块。对,以确保if - 块完成后立即解锁互斥锁。

答案 2 :(得分:3)

  

是守护函数的std :: lock_guard,条件是否返回值?即。 returnBoolValue()

没有。关键部分从警卫声明开始。在条件之后宣布守卫 - 所以它没有守卫。

  

我应该如何改进呢

如果你需要保护条件,那么在if语句之前移动守卫。