std::lock_guard 介绍
std::lock_gurad
是 C++11 中定义的模板类。定义如下:
template <class Mutex> class lock_guard;
lock_guard
对象通常用于管理某个锁(Lock)对象,因此与 Mutex RAII 相关,方便线程对互斥量上锁,即在某个 lock_guard
对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard
的生命周期结束之后,它所管理的锁对象会被解锁。
模板参数 Mutex 代表互斥量类型,例如 std::mutex 类型,它应该是一个基本的 BasicLockable 类型,标准库中定义几种基本的 BasicLockable 类型,分别是:
std::mutex
;std::recursive_mutex
;std::recursive_mutex
与std::mutex
一样,也是一种可以被上锁的对象,但是和std::mutex
不同的是,std::recursive_mutex
允许同一个线程对互斥量多次上锁(即递归上锁),来获得对互斥量对象的多层所有权,std::recursive_mutex
释放互斥量时需要调用与该锁层次深度相同次数的unlock()
,可理解为lock()
次数和unlock()
次数相同,除此之外,std::recursive_mutex
的特性和std::mutex
大致相同。
std::timed_mutex
;std::time_mutex
比std::mutex
多了两个成员函数,try_lock_for()
,try_lock_until()
。
std::recursive_timed_mutex
(注:BasicLockable 类型的对象只需满足两种操作,lock 和 unlock,另外还有 Lockable 类型,在 BasicLockable 类型的基础上新增了 try_lock
操作,因此一个满足 Lockable 的对象应支持三种操作:lock,unlock 和 try_lock;最后还有一种 TimedLockable 对象,在 Lockable 类型的基础上又新增了 try_lock_for
和 try_lock_until
两种操作,因此一个满足 TimedLockable 的对象应支持五种操作:lock, unlock, try_lock, try_lock_for, try_lock_until)。
在 lock_guard
对象构造时,传入的 Mutex 对象(即它所管理的 Mutex 对象)会被当前线程锁住。在lock_guard
对象被析构时,它所管理的 Mutex 对象会自动解锁,由于不需要程序员手动调用 lock 和 unlock 对 Mutex 进行上锁和解锁操作,因此这也是最简单安全的上锁和解锁方式,尤其是在程序抛出异常后先前已被上锁的 Mutex 对象可以正确进行解锁操作,极大地简化了程序员编写与 Mutex 相关的异常处理代码。
值得注意的是,lock_guard
对象并不负责管理 Mutex 对象的生命周期,lock_guard
对象只是简化了 Mutex 对象的上锁和解锁操作,方便线程对互斥量上锁,即在某个 lock_guard
对象的声明周期内,它所管理的锁对象会一直保持上锁状态;而 lock_guard
的生命周期结束之后,它所管理的锁对象会被解锁。
lock_guard
构造函数如下表所示:
locking (1) |
|
lock_guard 对象管理 Mutex 对象 m,并在构造时对 m 进行上锁(调用 m.lock())。 |
---|---|---|
adopting (2) |
|
lock_guard 对象管理 Mutex 对象 m,与 locking 初始化(1) 不同的是, Mutex 对象 m 已被当前线程锁住。 |
copy [deleted](3) |
|
lock_guard 对象的拷贝构造和移动构造(move construction)均被禁用,因此 lock_guard 对象不可被拷贝构造或移动构造。 |
adopt_mutex:“收养锁”- 先上锁,然后托管给lock_guard这个类,之后如果发生了异常阿也不需要没有解锁而产生死锁的现象。
void test() {//std::adopt_mutex的大妙处
test_mutex.lock();
lock_guard<std::mutex> lg(test_mutex, std::adopt_lock);
//在这里进行收养锁
cout << "hello test" << endl;
}
void test(int) {//test的配套练习
test_mutex.lock();
cout << "hello test(int)" << endl;
test_mutex.unlock();
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!