使用std::lock_guard时,return语句中的变量访问是否受锁保护?
问题解答
结论
第二种写法是完全安全的,return语句中对bar变量的访问仍然处于std::lock_guard的锁保护范围内。
原理说明
- C++标准规定,局部对象的析构时机为离开其所在作用域的时刻,
std::lock_guard正是在自身析构函数中完成互斥锁的释放操作。 - 函数
return语句的执行顺序是固定的:- 先计算
return后跟随的表达式的值,将其作为返回值暂存 - 销毁当前函数作用域内的所有局部对象(包括你声明的
tLock) - 把暂存的返回值返回给函数调用方
- 先计算
- 你给出的两段代码逻辑没有本质差异:第一段代码中
if分支判断bar值、执行return的过程中,锁始终处于持有状态;第二段代码中bar == 123的比较运算完成后,才会触发tLock的析构释放锁,因此对共享变量bar的读取操作全程受锁保护,不存在线程安全风险。
注意事项
只有一种场景需要额外规避:如果return返回的是局部变量的指针或引用,会出现返回值指向的资源被销毁的问题,但这属于普通的局部变量生命周期问题,和互斥锁的保护逻辑无关。
内容的提问来源于stack exchange,提问作者artsin
相关产品推荐
相关产品推荐

