关于std::lock_guard无变量与带变量写法的正确性问询
std::lock_guard无变量写法的有效性分析
你的判断完全正确——第一种写法无效,无法保护后续的m_value赋值操作,锁只会被短暂持有。
原因解析
当你写出std::lock_guard<std::mutex>(m_mutex);这样的代码时,实际上是创建了一个临时的lock_guard对象。C++中临时对象的生命周期仅局限于当前语句:这行代码执行完毕后,临时对象会立即被销毁,同时自动解锁对应的mutex。
而后续的m_value = "2";是在锁已经被释放后才执行的,完全脱离了mutex的保护,线程安全无法得到保障。
对比常规写法
常规写法std::lock_guard<std::mutex> lk(m_mutex);创建的是一个具名局部变量,它的生命周期会持续到当前作用域结束(也就是func函数执行完、离开大括号时)。在m_value赋值的整个过程中,lock_guard始终持有锁,确保这段操作是线程安全的。
核心逻辑
std::lock_guard是基于RAII(资源获取即初始化)机制实现的:对象构造时自动加锁,析构时自动解锁。只有让lock_guard对象的生命周期完整覆盖需要保护的代码段,才能起到预期的线程同步作用。临时对象的生命周期太短,根本无法满足这个要求。
内容的提问来源于stack exchange,提问作者xeed
相关产品推荐
相关产品推荐

