设计思想与原理
实例构造时进行加锁,析构时进行解锁,利用栈上对象生命周期的特性,维护管理者锁的状态,锁的释放将会由操作系统去执行,避免了类似std::mutex等互斥锁上锁后,由于异常导致锁的unlock()不能执行到,导致程序阻塞。
lock_guard 类模板原型
见代码注释
template<typename _Mutex>
class lock_guard
{
public:
typedef _Mutex mutex_type;
//用一个锁进行实例化,构造时自动加锁
explicit lock_guard(mutex_type& __m) : _M_device(__m)
{ _M_device.lock(); }
//adopt_lock_t告诉lock_guard,传递的锁__m是一个已经被占用的互斥锁
//用于管理已经被占用的锁
lock_guard(mutex_type& __m, adopt_lock_t) noexcept : _M_device(__m)
{ } // calling thread owns mutex
//对象析构的时候自动解锁
~lock_guard()
{ _M_device.unlock(); }
//底层的锁不能进行转移,不能拷贝构造也不能赋值
lock_guard(const lock_guard&) = delete;
lock_guard& operator=(const lock_guard&) = delete;
private:
mutex_type& _M_device;
};
adopt_lock_t的作用:
adopt_lock_t告诉lock_guard,传递的锁__m是一个已经被占用的互斥锁,不需要再次加锁。
假设某个线程已经获取了一个互斥锁,并且需要在工作完成后释放该锁,但需要在这段时间内保持锁的状态,以便其他线程不会同时访问共享资源。
在此情况下,可以创建一个带有std::adopt_lock_t
参数的std::lock_guard
对象,以便在当前作用域结束时自动释放锁,并确保其他线程无法访问共享资源。
此时,std::lock_guard
对象不会再次尝试获取锁,而是直接接管已经被占用的锁。
补充:
不支持拷贝和赋值,底层管理的锁是独一份的。