std::lock_guard在if块中的作用域
scope of std::lock_guard inside if block
目前正在学习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块的}
时(通过自然地流经那里,或通过return
、throw
或jump语句"强制"通过)。
这当然也说明了如何扩展互斥锁"保护"的范围:扩展lock
变量的范围:
{
std::lock_guard<std::mutex> lock(mutex_var);
if(returnBoolValue())
{
....
....
}
}
请注意,我在"lock
+ if
"对周围添加了一个额外的块,以确保在if
块完成后立即解锁互斥锁。
是std::lock_guard保护返回if条件内值的函数吗?ie。returnBoolValue ()
。临界区从守卫的宣告点开始。guard是在condition之后声明的,所以它不是被保护的。
我该如何改进它
如果还需要对条件进行保护,则将保护移到If语句之前
相关文章:
- 未在作用域中声明unordered_map
- 有没有一种方法可以在编译时获得作用域类名
- C++quit()函数中可能存在作用域问题
- 未在此作用域OpenCV3.4中声明cvSaveImage
- 全局作用域中函数指针的赋值
- 在类函数中初始化外部作用域变量
- 不同作用域中的静态变量和全局变量
- 是同一作用域的函数部分中的函数调用
- 未在此作用域中声明的函数和变量 (C++)
- 类作用域的类型别名"using":[何时]方法中的用法可以先于类型别名?
- C++If语句变量作用域
- 不带内部作用域的 if 语句
- 具有if条件的作用域锁定
- 条件if中类成员的作用域
- 嵌套if中的作用域不明确
- 是否有可能在不使用指针的情况下将变量的作用域扩展到if语句之外?
- 扩展在if/else序列中初始化的变量的作用域
- 变量是否可以仅在 if 语句的作用域中定义,类似于通常为 for 循环所做的那样?
- std::lock_guard在if块中的作用域
- 在if语句if C++中创建对象时出现作用域问题