今天遇到lock_guard,大概学习了一下,先贴出源码。
// LOCKS
template<class _Mutex>class lock_guard
{ // class with destructor that unlocks mutex
public:
typedef _Mutex mutex_type;
explicit lock_guard(_Mutex& _Mtx)
: _MyMutex(_Mtx)
{ // construct and lock
_MyMutex.lock();
}
lock_guard(_Mutex& _Mtx, adopt_lock_t)
: _MyMutex(_Mtx)
{ // construct but don't lock
}
~lock_guard() _NOEXCEPT
{ // unlock
_MyMutex.unlock();
}
#if _HAS_FUNCTION_DELETE
lock_guard(const lock_guard&) = delete;
lock_guard& operator=(const lock_guard&) = delete;
#else /* _HAS_FUNCTION_DELETE */
private:
lock_guard(const lock_guard&); // not defined
lock_guard& operator=(const lock_guard&); // not defined
#endif /* _HAS_FUNCTION_DELETE */
private:
_Mutex& _MyMutex;
};
std :: lock_guard
标题中定义
<mutex>
| ||
template < class Mutex > class lock_guard ; | ||
该类lock_guard
是一个互斥包装,它提供了一个方便的RAII风格的机制,用于在作用域的持续时间内拥有互斥体。
当lock_guard
创建对象时,它会尝试获取给定的互斥体的所有权。当控件离开lock_guard
创建对象的范围时,lock_guard
被破坏并释放互斥体。
该lock_guard
班是不可复制的。
模板参数
互斥 | - | 要锁定的互斥体的类型。该类型必须符合BasicLockable 要求 |
会员类型
会员类型 | 定义 |
mutex_type | 互斥 |
会员功能
构造一个lock_guard,可选地锁定给定的互斥体 (public member function) | |
破坏lock_guard对象,解锁底层的互斥 (public member function) | |
运算符=
[删除]
| 不可复制 (public member function) |
扣除指南(自C ++ 17起)
简单的说,它是与mutex配合使用,把锁放到lock_guard中时,mutex自动上锁,lock_guard析构时,同时把mutex解锁。
std::lock_guard是一个局部变量,创建时,g_i_mutex 上锁,析构时g_i_mutex解锁。这个功能在函数体比较长,尤其是存在多个分支的时候很有用。