You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:22:02