(1) unique_lock 取代lock_guard
(2)unique_lock的第二个参数
2.1.std::adopt_lock
2.2 std::try_to_lock
2.3 std::defer_lock
(3) unique_lock的成员函数
3.1 lock
3.2 unlock()
3.3 try_lock()
3.4 release()
(4) unique_lock 所有权的传递
unique_lock 取代lock_guard
unique_lock 是一个类模板,工作中,一般使用lock_guard(推荐使用);lock_guard取代了mutex的lock() 和 unlock() 的函数。
unique_lock比lock_guard灵活了很多;效率上差一点,内存上多一点。
// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include
#include
#include
#include
#include
#include
二、lock_guard的第二个参数
adopt_lock标记作用;表示这个互斥量已经被lock了,(你必须要把互斥量提前lock,否者会报异常)
adopt_lock标记的效果就是:假设调用方线程已经拥有了互斥的所有权(已经lock()成功了),通知lock_guard不需要在构造函数中lock这个互斥量了;
unique_lock也可以带std::adopt_lock
my_mutex1.lock()
std::unique_lock sbguard1(my_mutex1,std::adopt_lock)
// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include
#include
#include
#include
#include
#include
(2.2) std::try_to_lock
// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include
#include
#include
#include
#include
#include
(2.3)std::defer_lock
unique_lock 所支持的另一个参数是:std::defer_lock(用这个defer_lock 的前提是程序员不能自己先去lock 这个mutex,否者会报异常,这点和try_to_lock一样的)
defer_lock的意思就是 并没有给mutex加锁,来介绍一下unique_lock的重要成员函数。
1.unique_lock 的成员函数 lock
// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include
#include
#include
#include
#include
#include
2.unique_lock 的成员函数 unlock
引入unique_lock 的成员函数 unlock,目的就是:因为有一些非共享代码需要处理,咋们不希望一直被lock住,当共享代码处理完了之后,就立马unlock。
// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include
#include
#include
#include
#include
#include
3.3 try_lock(),尝试给互斥量加锁,如果拿不到锁,则返回false,如果拿到了锁,返回true,这个函数是不阻塞的。
// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include
#include
#include
#include
#include
#include
4.release() 返回它所管理的mutex对象指针,并释放所有权;也就是说,这个unique_lock 和 mutex不再有关系。
//严格区分unlock()和release()的区别,不要混淆。
//如果原来mutex对象处于加锁状态,你有责任接管过来并负责解锁。(release返回的是原始mutex的指针)
// test.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include
#include
#include
#include
#include
#include
4.unique_lock 所有权的传递(转移)
一般有2种方法
1.std::move(...)
2.return unique_lock对象