std::lock_guard在if块中的作用域

scope of std::lock_guard inside if block

本文关键字:作用域 if lock guard std      更新时间:2023-10-16

目前正在学习std::mutex,希望得到一些帮助。如果我有一个代码看起来像-

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

std::lock_guard保护返回if条件内值的函数吗?ie。returnBoolValue()

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


  • std::mutex - http://en.cppreference.com/w/cpp/thread/mutex
  • std::lock_guard - http://en.cppreference.com/w/cpp/thread/lock_guard

如果不添加另一个作用域,目前是不可能做到这一点的(c++ 17有办法做到这一点)

解决方案是

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

c++ 17:

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

锁保护在互斥锁构造时将其锁住:也就是说,当程序的控制流达到lock的声明时。当保护被破坏时,它释放(解锁)互斥锁,这发生在控制流流经终止then块的}时(通过自然地流经那里,或通过returnthrow或jump语句"强制"通过)。

这当然也说明了如何扩展互斥锁"保护"的范围:扩展lock变量的范围:

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

请注意,我在"lock + if"对周围添加了一个额外的块,以确保在if块完成后立即解锁互斥锁。

是std::lock_guard保护返回if条件内值的函数吗?ie。returnBoolValue ()

。临界区从守卫的宣告点开始。guard是在condition之后声明的,所以它不是被保护的。

我该如何改进它

如果还需要对条件进行保护,则将保护移到If语句之前