一 前提,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