1.std::lock_guard
std::lock_guard其实就是简单的RAII(Resource Acquisition Is Initialization)封装,资源获取即初始化。在构造函数中进行加锁,析构函数中进行解锁,这样可以保证函数退出时,锁一定被释放。
不可以对 std::lock_guard
调用 unlock
进行解锁操作。std::lock_guard
是一个非常简单的互斥量管理类,设计初衷是提供一种 RAII(资源获取即初始化)风格的锁机制,当 std::lock_guard
对象创建时锁定互斥量,并在对象销毁时析构函数里自动解锁互斥量。std::lock_guard
没有提供解锁和重新锁定的功能。它的接口非常简单,只包含构造函数和析构函数,没有 unlock
或 lock
方法。这使得 std::lock_guard
更加轻量级,但也更不灵活。
构造函数:
explicit lock_guard(mutex_type& m); // 引用类型,锁定互斥量m,析构函数中解锁 // 其中mutex_type是模板参数的别名 template <class Mutex> class lock_guard { public: using mutex_type = Mutex; // 定义 mutex_type 为模板参数 Mutex explicit lock_guard(mutex_type& m); ~lock_guard(); // ... };
2.std::unique_lock
转自:https://www.cnblogs.com/moodlxs/p/10111843.html
std::lock_guard的功能超集, 封装了各种加锁操作,阻塞的,非阻塞的,还可以结合条件变量一起使用,基本上对锁的各种操作都封装了。所以性能和内存开销都比std::lock_guard大得多,需要有选择地使用。 std::unique_lock也会在析构的时候自动解锁,所以说,是std::lock_guard的功能超集。
支持多种加锁模式:
unique_lock() noexcept; // 默认构造函数创建一个不与任何互斥量相关联的 unique_lock 对象 explicit unique_lock(mutex_type& m); //创建一个与互斥量 m 相关联并立即锁定它的 unique_lock 对象 unique_lock( mutex_type& m, std::defer_lock_t t ); //延迟加锁 unique_lock( mutex_type& m, std::try_to_lock_t t ); //尝试加锁 unique_lock( mutex_type& m, std::adopt_lock_t t ); //马上加锁 unique_lock(unique_lock&& u) noexcept; // 移动构造函数。原来的 unique_lock 对象将不再持有互斥量。
标签:std,lock,guard,mutex,unique,type From: https://www.cnblogs.com/BlueBlueSea/p/18288619