化验痰可以检查出什么| 慢性宫颈炎是什么原因引起的| 聋哑人为什么不会说话| 臻字的意思是什么| 妇检tct是什么检查| 围绝经期吃什么药调理| 颈椎病应该挂什么科| 共济失调是什么意思| 房颤吃什么药好| 减脂是什么意思| 胚轴发育成什么| 金牛座属于什么象星座| 紫癜是什么病| 忘忧草是什么意思| 学兽医需要什么学历| 爱生闷气的人容易得什么病| 中文是什么意思| 腰两边疼是什么原因| 成什么结什么| 为什么会头疼| 党委委员是什么级别| 奶不够吃是什么原因| 胆囊炎挂什么科室| 1992年是什么命| 什么的手| 3月1日是什么星座| 听之任之是什么意思| 柠檬茶喝了有什么好处| 直肠ca代表什么病| 腿纹不对称有什么影响| 玉米淀粉可以用什么代替| 皱褶什么意思| 经常做噩梦是什么原因| 梦见青蛙是什么预兆| 支气管炎什么症状| 过生日吃什么菜寓意好| 心身医学科是看什么病| ab型和a型生的孩子是什么血型| 后背筋膜炎吃什么药| 查肝功能挂什么科| 书的五行属性是什么| 喝啤酒吃什么菜最好| bug是什么意思| 笨什么笨什么| 为什么梦不到死去的亲人| 小燕子的尾巴像什么| 抵触是什么意思| 肠息肉有什么症状| 梦见手指流血是什么预兆| 这是什么| 什么是放疗治疗| 入职是什么意思| 嗫嚅是什么意思| 公安和警察有什么区别| 测脸型适合什么发型| 梦见手机坏了是什么意思| 更年期一般在什么年龄| 12月1日什么星座| 碱和小苏打有什么区别| 蜂蜜水什么时间喝最好| 头上长疙瘩是什么原因| 血沉高是什么原因引起的| 德国是什么民族| 桑葚有什么好处| 什么榴莲品种最好吃| 越南三宝是什么| 胸膜炎有什么症状| 清明上河图什么季节| 吃什么鱼最健康| 小便黄吃什么药| 右手中指指尖麻木是什么原因| 小211是什么意思| 扁平苔藓是什么病| 怀孕是什么症状| 10月9日什么星座| 消化不良用什么药| 吃桑葚有什么好处| 工口是什么意思| 喉咙不舒服是什么原因| 肝什么相照| 龟头炎用什么药| 颔是什么部位| Zucchini是什么意思| 梦见自己生小孩是什么征兆| 淋巴用什么药可以消除| 雏凤是什么意思| 靠北是什么意思| 红茶用什么茶具泡好| EV是什么| 中午12点半是什么时辰| 手指甲发黑是什么原因| 北五行属什么| 三天没有大便是什么原因| 咽喉炎吃什么药有效| 做梦买鞋是什么意思| 一什么机枪| essential是什么意思| 肚子大了是什么原因造成的| 反刍什么意思| 鞘是什么意思| 姓彭的女孩子取什么名字好| 三元及第是什么意思| 腺肌症是什么意思| 等闲识得东风面下一句是什么| 2021年是属什么年| 月经提前10天正常吗是什么原因| 尿毒清颗粒主治什么病| 梦见白发是什么意思| 老登是什么意思| 莫非的近义词是什么| 笑点低的人说明什么| 桃园三结义是什么意思| 空巢老人什么意思| 手指上的斗和簸箕代表什么意思| 金童玉女是什么意思| 经常吃生花生有什么好处和坏处| 脚掌疼是什么原因| 胸一大一小什么原因| 没事找事是什么意思| 苟且是什么意思| 休止期脱发什么意思| 明前茶什么意思| HlV是什么| 阳历是什么| hpv检查挂什么科| 什么验孕棒准确率高| 为什么会长肥胖纹| 不置可否什么意思| t11椎体在什么位置| 湿气重挂什么科| 拔气罐有什么好处| 膝盖痛是什么原因| 巳时五行属什么| 川字纹有什么影响| 游泳比赛中wj是什么意思| 蜂窝组织炎是什么病| opec是什么意思| 大暑什么时候| 春秋大梦是什么意思| 阳气不足吃什么药| 什么是扁桃体| 211是什么意思| 条件反射是什么意思| 睾丸积液吃什么药| 天什么地| ash是什么牌子| 高考300分能上什么大学| 皮肤发白一块一块的是什么病| 闪购是什么| 接吻是什么感觉| 笃行是什么意思| 药物流产吃什么药| 舌头有问题看什么科| 为什么容易被蚊子咬| 尿频尿急吃什么药最好| 向日葵什么时候采摘| 卫生湿巾是干什么用的| 草莓的花是什么颜色| 什么是达人| 阿莫西林治什么| 一九九八年属什么生肖| 煮中药用什么锅| 网红是什么意思| 猪心炖什么治失眠| 香菜什么时候种最合适| 打蛔虫吃什么药| 拉拉什么意思| 芋圆是什么做的| 甘油是什么东西| 7朵玫瑰花代表什么意思| 补肾吃什么东西效果最好| 脚底抽筋是什么原因引起的| 长江后浪推前浪是什么生肖| 做宫颈筛查能查出什么| 兵役是什么意思| 女累读什么| 猪肚炖什么好吃| 太爷爷的爸爸叫什么| 鞭炮笋学名叫什么| 脚趾头疼是什么原因| 头响脑鸣是什么原因引起的| 怀姜是什么姜| 酒精胶是粘什么的| 什么是公共场所| 10月是什么季节| 虱子长什么样子图片| 天生一对是什么意思| 湿气重是什么原因造成的| 钦此是什么意思| 维生素检查项目叫什么| 陈皮起什么作用| circle是什么意思| 钓黑鱼用什么饵最好| 红蜘蛛用什么药最有效| 黄鼠狼进屋是什么兆头| 锚什么意思| 血脂高是什么意思| 百脚虫的出现意味什么| 吃什么水果美白| 小便有点红是什么原因| 什么是梦| 眼睛飞蚊症用什么药能治好| 什么是中耳炎| 口干舌燥挂什么科| 女人吃榴莲有什么好处| 大脚趾外翻是什么原因| 不对劲是什么意思| 羊肉不能和什么一起吃| 人造奶油是什么做的| 眼前有亮光闪是什么问题| 人死后为什么要守夜| 宫颈纳氏囊肿是什么意思| 儿童便秘吃什么最管用| 梦见手链断了是什么意思| 为什么硬不起来| 立冬是什么时候| 蟑螂为什么叫小强| 野生型是什么意思| 唐僧取经取的是什么经| 白玫瑰花语是什么| 一个虫一个离念什么| igm是什么意思| 口巴读什么| 10月21日是什么星座| 1963年属兔的是什么命| 咳嗽吃什么食物| 痛风能吃什么鱼| 小腿灼热感是什么原因| 脑出血有什么后遗症| 2038年是什么年| 小孩子发烧手脚冰凉是什么原因| 阴历三月是什么星座| 3月27日是什么星座| wdf是什么意思| 阳痿早泄吃什么| 脸痒痒是什么原因| 血压压差小是什么原因| 磅礴是什么意思| 老师家访的目的是什么| 白羊属于什么象星座| 打疫苗挂什么科| hr是什么意思| 地下党是什么意思| nbi是什么意思| 拔罐拔出水是什么原因| 婴儿增强免疫力吃什么| 笑面虎比喻什么样的人| 9月10号是什么星座| 锌是补什么的| 肾结水有什么危害| 把握时机是指什么生肖| face是什么意思| 通马桶的工具叫什么| 盘核桃有什么好处| 大便拉不出来吃什么药| 毅力是什么意思| 劳伦拉夫属于什么档次| 步幅是什么意思| 老年人吃饭老是噎着是什么原因| 狗嚎叫有什么预兆| 为什么医院不用咳特灵| 长字五行属什么| 变应原皮内试验是测什么的| 溥仪为什么没有后代| 百度

习主席系列重要讲话"军事篇"是强军兴军科学指南

本文探讨了C++11中std::lock_guard和std::unique_lock的区别。lock_guard提供简洁的自动锁定/解锁功能,适用于简单场景;而unique_lock具备更多功能,如手动锁定、解锁,能与条件变量配合使用,适用于更复杂的控制流程。两者都遵循RAII原则,但unique_lock允许在不持有mutex的情况下进行操作。
百度 不仅自己的买卖做大了,乡亲们也跟着沾了光。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

@ 转载
看着这个老哥写的不错悄悄转过来

lock_guard

std::lock_guard使用起来比较简单,其在构造函数中对std::mutex变量进行锁定,在其析构函数中对std::mutex变量进行解锁,整个类没有对mutex进行解锁和加锁的对外接口,其源码如下:

template <class _Mutex>
class _LIBCPP_TYPE_VIS_ONLY lock_guard
{
public:
    typedef _Mutex mutex_type;
private:
    mutex_type& __m_;
public:
    _LIBCPP_INLINE_VISIBILITY
    explicit lock_guard(mutex_type& __m)
        : __m_(__m) {__m_.lock();}
    _LIBCPP_INLINE_VISIBILITY
    lock_guard(mutex_type& __m, adopt_lock_t)
        : __m_(__m) {}
    _LIBCPP_INLINE_VISIBILITY
    ~lock_guard() {__m_.unlock();}
private:
    lock_guard(lock_guard const&);// = delete;
    lock_guard& operator=(lock_guard const&);// = delete;
};

使用方法如下:

std::mutex g_mutex;
int g_var = 0;
void test_guard()
{
    std::lock_guard<std::mutex> guard(g_mutex);
    g_var ++;
}

unique_lock

unique_lock相比lock_guard,功能要多很多,其提供了对mutex的加锁(lock和try_lock)和解锁(unlock)操作,同时可以配合条件变量condition_variable使用:

template <class _Mutex>
class _LIBCPP_TYPE_VIS_ONLY unique_lock
{
public:
    typedef _Mutex mutex_type;
private:
    mutex_type* __m_;
    bool __owns_;
public:
    _LIBCPP_INLINE_VISIBILITY
    unique_lock() _NOEXCEPT : __m_(nullptr), __owns_(false) {}
    _LIBCPP_INLINE_VISIBILITY
    explicit unique_lock(mutex_type& __m)
        : __m_(&__m), __owns_(true) {__m_->lock();}
    _LIBCPP_INLINE_VISIBILITY
    unique_lock(mutex_type& __m, defer_lock_t) _NOEXCEPT
        : __m_(&__m), __owns_(false) {}
    _LIBCPP_INLINE_VISIBILITY
    unique_lock(mutex_type& __m, try_to_lock_t)
        : __m_(&__m), __owns_(__m.try_lock()) {}
    _LIBCPP_INLINE_VISIBILITY
    unique_lock(mutex_type& __m, adopt_lock_t)
        : __m_(&__m), __owns_(true) {}
    template <class _Clock, class _Duration>
    _LIBCPP_INLINE_VISIBILITY
        unique_lock(mutex_type& __m, const chrono::time_point<_Clock, _Duration>& __t)
            : __m_(&__m), __owns_(__m.try_lock_until(__t)) {}
    template <class _Rep, class _Period>
    _LIBCPP_INLINE_VISIBILITY
        unique_lock(mutex_type& __m, const chrono::duration<_Rep, _Period>& __d)
            : __m_(&__m), __owns_(__m.try_lock_for(__d)) {}
    _LIBCPP_INLINE_VISIBILITY
    ~unique_lock()
    {
        if (__owns_)
            __m_->unlock();
    }
private:
    unique_lock(unique_lock const&); // = delete;
    unique_lock& operator=(unique_lock const&); // = delete;
public:
#ifndef _LIBCPP_HAS_NO_RVALUE_REFERENCES
    _LIBCPP_INLINE_VISIBILITY
    unique_lock(unique_lock&& __u) _NOEXCEPT
        : __m_(__u.__m_), __owns_(__u.__owns_)
        {__u.__m_ = nullptr; __u.__owns_ = false;}
    _LIBCPP_INLINE_VISIBILITY
    unique_lock& operator=(unique_lock&& __u) _NOEXCEPT
        {
            if (__owns_)
                __m_->unlock();
            __m_ = __u.__m_;
            __owns_ = __u.__owns_;
            __u.__m_ = nullptr;
            __u.__owns_ = false;
            return *this;
        }
#endif  // _LIBCPP_HAS_NO_RVALUE_REFERENCES
    void lock();
    bool try_lock();
    template <class _Rep, class _Period>
        bool try_lock_for(const chrono::duration<_Rep, _Period>& __d);
    template <class _Clock, class _Duration>
        bool try_lock_until(const chrono::time_point<_Clock, _Duration>& __t);
    void unlock();
    _LIBCPP_INLINE_VISIBILITY
    void swap(unique_lock& __u) _NOEXCEPT
    {
        _VSTD::swap(__m_, __u.__m_);
        _VSTD::swap(__owns_, __u.__owns_);
    }
    _LIBCPP_INLINE_VISIBILITY
    mutex_type* release() _NOEXCEPT
    {
        mutex_type* __m = __m_;
        __m_ = nullptr;
        __owns_ = false;
        return __m;
    }
    _LIBCPP_INLINE_VISIBILITY
    bool owns_lock() const _NOEXCEPT {return __owns_;}
    _LIBCPP_INLINE_VISIBILITY
    _LIBCPP_EXPLICIT
        operator bool () const _NOEXCEPT {return __owns_;}
    _LIBCPP_INLINE_VISIBILITY
    mutex_type* mutex() const _NOEXCEPT {return __m_;}
};

unique_lock和lock_guard的区别

简单的说,unique_lock相对于lock_guard,会有更多特性。

  1. unique_lock和lock_guard都遵循RAII。

  2. unique_lock和lock_guard最大的不同是:unique_lock不需要始终拥有关联的mutex,而lock_guard始终拥有mutex。

这意味着unique_lock需要利用owns_lock()判断是否拥有mutex。
另外,如果要结合使用条件变量,应该使用unique_lock。

参考[StackOverflow]

std::unique_lockstd::lock_guard都是C++标准库提供的互斥RAII封装工具,用于实现互斥访问,但它们在使用方法功能上有一些不同之处。\[1\] std::lock_guard是基于互斥std::mutex实现的,而std::unique_lock是基于通用std::unique_lock实现的。std::lock_guard是不可移动的,只能通过构造函数初始化析构函数销毁,而std::unique_lock是可移动的,可以拷贝、赋值、移动。\[1\] std::unique_lock提供了更多的控制的行为,比如超时、不定、条件变量等。因此,如果只需要简单的互斥保护,使用std::lock_guard更好。而如果需要更灵活的操作,可以选择使用std::unique_lock。\[1\] 下面是std::lock_guardstd::unique_lock的简单使用示例,可以看出二者在使用方法上的区别:\[2\] 示例:用std::lock_guard加互斥 { std::lock_guard<std::mutex> lock(mutex); // 互斥操作 } 示例:用std::unique_lock加互斥并手动释放 { std::unique_lock<std::mutex> lock(mutex); // 互斥操作 lock.unlock(); // 手动释放 // 非互斥操作 lock.lock(); // 再次加 // 互斥操作 } 总结来说,std::lock_guard适用于简单的互斥保护,而std::unique_lock提供了更多的灵活性控制的行为的功能。根据具体的需求选择使用哪种封装工具。\[1\] #### 引用[.reference_title] - *1* *2* [std::lock_guard(轻std::unique_lock(重)区别](http://blog.csdn.net/nihao_2014/article/details/131208348)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] - *3* [C++lock_guardunique_lock 的使用](http://blog.csdn.net/sinat_31608641/article/details/107734045)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control_2,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
一个月一个寸读什么 红颜薄命的意思是什么 什么头十足 前列腺炎吃什么中成药 命门是什么意思
6月23号是什么星座 咳绿痰是什么原因 网络拒绝接入什么意思 九月九日是什么节日 降血脂有什么好办法
眩晕症是什么病 米老鼠叫什么名字 庄周梦蝶是什么意思 宫腔占位什么意思 为什么天天晚上做梦
果五行属什么 马杀鸡是什么意思 同房后小腹痛什么原因 香港商务签证需要什么条件 羊水偏多是什么原因
为什么叫985大学hcv9jop8ns3r.cn 尼龙是什么hcv7jop9ns0r.cn 什么无云hcv8jop2ns2r.cn 今年男宝宝取什么名字好onlinewuye.com resp是什么hcv7jop7ns4r.cn
中元节会开什么生肖hcv8jop6ns0r.cn 新生儿满月打什么疫苗hcv8jop3ns6r.cn 肝癌晚期什么症状hcv8jop3ns2r.cn 门槛什么意思hcv8jop5ns8r.cn 进击的巨人真相是什么hcv8jop6ns9r.cn
消化酶缺乏是什么症状dajiketang.com 胆固醇高是什么引起的hcv9jop5ns0r.cn hp医学上是什么意思hcv8jop1ns1r.cn 百福图挂在家里什么位置好hcv9jop0ns3r.cn 什么是飞秒手术hcv8jop4ns7r.cn
梦见很多蜘蛛是什么意思hcv8jop1ns6r.cn 假牙什么材质的最好hcv9jop6ns9r.cn 吃葡萄干对身体有什么好处hcv7jop6ns0r.cn 老人脚浮肿是什么原因引起的hcv7jop7ns1r.cn 有什么症状是肯定没怀孕hcv7jop9ns0r.cn
百度