以下为网上搜罗的有关unique_lock的总结,如有读者看到有任何问题和补充,欢迎留言~
1. unique_lock比lock_guard更灵活
unique_lock是个类模板,
lock_guard替代了mutex的lock()和unlock()的功能,
unique_lock扩展了lock_guard。
2. unique_lock的参数
unique_lock的参数,第一个为绑定的mutex,第二个为选项类型。
std::unique_lock<std::mutex> uni_lock(my_mutex, 参数);
选项类型包括:
std::adopt_lock
std::try_to_lock
std::defer_lock
2.1 std::adopt_lock
表示参数一中的mutex已经被lock了,创建unique_lock时不再自动上锁。
2.2 std::try_to_lock
创建unique_lock时尝试取lock这个mutex,之后使用owns_lock()来查看是否上锁成功。
std::unique_lock(std::mutex) uni_lock(my_mutex,std::try_to_lock);
if(uni_lock.owns_lock()){
std::cout<<"we lock this mutex"<<std::endl;
}else{
std::cout<<"it is already locked by others, we fail to lock this mutex"<<std::endl;
}
2.3 std::defer_lock
生成一个不加锁的uniqe_lock,我们自己来手动加锁和解锁。前提是参数一的mutex尚未加锁。
3. unique_lock的成员
3.1 lock(), unlock()
std::unique_lock(std::mutex) uni_lock(my_mutex,std::defer_lock);
//先不加锁,干别的事情
uni_lock.lock();
//处理需要加锁的区域
uni_lock.unlock();//也可以让unique_lock自动解锁
3.2 try_lock()
尝试加锁,try_to_lock是在创建unique_lock时尝试加锁,try_lock是unique_lock的成员,是在调用的时候加锁。
std::unique_lock<std::mutex> uni_lock(my_mutex, std::defer_lock);
if(uni_lock.try_lock()){
std::cout<<"we lock this mutex"<<std::endl;
}else{
std::cout<<"it is already locked by others, we fail to lock this mutex"<<std::endl;
}
3.3 release()
return 创建时绑定的mutex的指针,并解除绑定。
std::unique_lock<std::mutex> uni_lock(my_mutex);
std::mutex *p = uni_lock.release();
p->unlock();//此时mutex已经不能自己动解锁了,需要手动解锁
4. unique_lock的所有权传递
错误例子,unique_lock不能拷贝
std::unique_lock<std::mutex> uni_lock_1(my_mutex);
std::unique_lock<std::mutex> uni_lock_2(uni_lock_1);
使用std::move()
std::unique_lock<std::mutex> uni_lock_2(std::move(uni_lock_1));
uni_lock_2获得了原来uni_lock_1绑定的mutex所有权,uni_lock_1不再拥有mutex的所有权。