52 C++ unique_lock 替代 lock_guard 详解

本文详细解析了C++中的lock_guard和unique_lock类模板,重点介绍了它们的构造方法、参数含义以及各自的使用场景,如adopt_lock、try_to_lock、owns_lock和defer_lock等特性。

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

一  前提,lock_guard 详解:

lock_guard是 个类模版,不同的是 lock_guard 的这个模版只能<mutex>,

lock_guard<mutex> mylock_guard(mymutex);

可以看到,lock_guard在实例化对象的时候,有两种构造方法。

我们这里看有两个参数的构造方法,也就是第二个参数 是std::adopt_lock_t的构造方法。

std::adopt_lock_t  

假设调用方线程已拥有互斥的所有权

struct adopt_lock_t { explicit adopt_lock_t() = default; };

从C++的文档中可以看出,这玩意是个 struct,实际上,理解为标志位更为合适。

adopt_lock_t  意思是:我们在lock_guard构造函数中不调用 mutex1.lock(),只是在析构函数中调用 mutex1.unlock();

mymutex1.lock()
lock_guard<mutex> sbguard1(mymutex1,adopt_lock);

二  unique_lock 详解

unique_lock 也是 类模版,只能使用<mutex>,

unique_lock的构造函数比lock_guard的构造函数多了几个:当前我们研究一下第二个参数是 ;

adopt_lock 意思是:调用这一行之前,一定是有lock()过的,我们在lock_guard构造函数中不调用 mutex1.lock(),只是在析构函数中调用 mutex1.unlock();

mymutex1.lock()
unique_lock <mutex> sbguard1(mymutex1,adopt_lock);

try_to_lock 意思是:我们会尝试用mutex的lock()去锁定这个mutex,但是如果没有锁定成功,我也会立即返回,并不会阻塞在这里。那么怎么知道锁定成功了吗?

owns_lock()方法说明:检查 *this 是否占有锁定的互斥。

例子:

mymutex1.lock()
unique_lock <mutex> sbguard1(mymutex1,try_to_lock);

if(sbguard1.owns_lock()){

        //如果拿到了锁子的逻辑

} else{

        //没拿到锁子的逻辑

}

defer_lock 意思是:并没有给mutex加锁:初始化一个没有加锁的mutex,那么不能给mutex加锁,这个有啥用?

-------实际上要结合 unique_lock 的成员函数来能理解为什么要这么干。

lock()函数

好处是不用管unlock(),在 sbguard1的析构函数调用的时候,会调用 mymutex1的析构函数

            unique_lock<mutex> sbguard1(mymutex1, defer_lock);
&nbs

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值