多线程之unique_lock和Lazy Initialization

本文介绍了std::unique_lock相对于std::lock_guard在多线程中的优势,如允许在作用域内解锁和控制锁的时机。同时探讨了Lazy Initialization的概念,通过示例展示了如何使用std::call_once保证线程安全地只执行一次初始化操作,避免性能损耗,并解释了std::once_flag的作用和注意事项。
摘要由CSDN通过智能技术生成

前面使用过lock_guard来对线程进行了管理,lock_guard对线程管理的特点是,从声明lock_guard开始,到lock_guard作用域结束,lock_guard参数里的线程一直会被锁住,如果在lock_guard析构之前,std::mutex对象被unlock了,那么lock_guard解锁时就会出现空指针等错误。std::unique_lock与他不同,可以在unique_lock范围内对std::mutex对象进行unlock,unique_lock提供的弹性不止如此。

例如,添加std::defer_lock参数,加了std::defer_lock这个参数之后,告诉locker,mutex对象并没有被锁住,然后可以为指定代码加锁和解锁,如下:

std::unique_lock<std::mutex> locker(m_mutex,std::defer_lock);
locker.lock();
std::cout<<"from:"<<id<<"value:"<<value<<std::endl;
locker.unlock();

需要注意的是,不管是lock_guard还是unique_lock,他们都不能被复制,unique_lock可以被移动,lock_guard不可以被移动,当我们移动unique_lock时,mutex对象的控制权,也从一个unique_lock转移到另一个unique_lock。

std::unique_lock<std::mutex> lo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值