Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std范围::锁定if块内的防护装置_C++_Multithreading_C++11_Mutex - Fatal编程技术网

C++ std范围::锁定if块内的防护装置

C++ std范围::锁定if块内的防护装置,c++,multithreading,c++11,mutex,C++,Multithreading,C++11,Mutex,目前正在学习std::mutex,希望能得到一些帮助。如果我有一个代码看起来像- .... if(returnBoolValue()) { std::lock_guard<std::mutex> lock(mutex_var); .... .... } .... 。。。。 if(returnBoolValue()) { std::lock\u guard lock(互斥锁变量); .... .... } .... std::lock\u guard保护函数

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

....
if(returnBoolValue())
{
    std::lock_guard<std::mutex> lock(mutex_var);
    ....
    ....
}
....
。。。。
if(returnBoolValue())
{
std::lock\u guard lock(互斥锁变量);
....
....
}
....
std::lock\u guard
保护函数是否返回if条件中的值?即返回布尔值()

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


  • std::mutex
    -
  • std::锁紧装置
    -
std::lock_guard是否保护函数返回if条件中的值?即返回布尔值()

否。关键部分从警卫声明点开始。在条件之后声明保护-因此它不受保护

我应该如何改进它


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

目前,如果不添加另一个作用域,则无法执行此操作(C++17有一种方法可以做到这一点)

解决办法是

....
{
   std::lock_guard<std::mutex> lock(mutex_var);
   if(returnBoolValue())
   {
      ....
      ....
   }
}
....
。。。。
{
std::lock\u guard lock(互斥锁变量);
if(returnBoolValue())
{
....
....
}
}
....
C++17方式:

....
if(std::lock_guard<std::mutex> lock(mutex_var); returnBoolValue())
{
   ....
   ....
}
....
。。。。
if(std::lock\u guard lock(mutex\u var);returnBoolValue())
{
....
....
}
....

构建互斥锁时,锁保护会锁定互斥锁:也就是说,当程序的控制流达到
lock
的声明时。当保护被破坏时,它释放(解锁)互斥锁,当控制流通过
}
终止then块时,就会发生这种情况(通过自然地通过then块,或者通过
返回
抛出
或跳跃语句“强制”通过then块)

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

{
  std::lock_guard<std::mutex> lock(mutex_var);
  if(returnBoolValue())
  {
    ....
    ....
  }
}
{
std::lock\u guard lock(互斥锁变量);
if(returnBoolValue())
{
....
....
}
}

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

互斥锁将仅保护
returnBoolValue
之后的所有内容,并且仅保护
if
范围内的部分。你用
证明
是什么意思?改善?那么如何改进呢?@Hayt我需要guard也涵盖
returnBoolValue()
。对于C++17方式,您应该能够省略
部分