独占资源:mutex和lock_gurad

本文围绕C++11展开,介绍了mutex互斥量,它用于独占访问资源,搭配lock_guard使用更佳,lock_guard可确保离开作用域时解锁。还介绍了recursive_mutex,允许同一线程多次调用lock()。此外,讲解了std::lock()和std::try_lock()处理多个mutex的方式及特点。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

mutex

mutex互斥量用来以独占方式访问资源。

操作作用
mutex m默认构造函数,构建一个未锁定的mutex对象
~mutex()析构函数
m.lock()尝试锁住mutex。如果mutex已是锁定状态,会造成阻塞
m.try_lock()尝试锁住mutex,成功则返回true
m.try_lock_for(dur)尝试在时间段dur内锁住mutex,成功则返回true
m.try_lock_until(tp)尝试在时间点tp之前锁住mutex,成功则返回true
m.unlock()解锁mutex
m.native_handle()

lock_guard

mutex可以单独使用,但更好的是搭配lock_guard使用。
lock_guard可以确保一个locked mutex在离开lock_guard作用域时总会被解锁。

操作作用
lock_guard lg(m)为mutex对象构建一个lock_guard,并锁定mutex对象
lock_guard(m, adopt_lock)为已经锁定的mutex对象构建一个lock_guard
~lock_guard()析构函数,解锁mutex对象

recursive_mutex

循环互斥量recursive_mutex允许在同一个线程内多次调用lock()而不会引起阻塞,在调用一次unlock()后解锁mutex。

std::lock()和std::try_lock()

有时候一个线程需要同时锁定多个mutex,如果对多个mutex进行逐一锁定可能会引起问题:锁住了m1但在m2阻塞了;如果以不同的次序锁住相同的mute还可能引起死锁。

mutex m1;
mutex m2;
lock_guard<mutex> lg1(m1);
lock_guard<mutex> lg2(m2);

lock()处理多个mutex时,只有当所有mutex对象都是释放状态,才会把所有mutex锁住,否则会阻塞直到所有mutex变成释放状态。

mutex m1;
mutex m2;
{
	// 如果m1在另一线程中被锁住,lock不会单独锁住m2
	// 而是等待m1被释放后,再同时锁住m1、m2
	lock(m1, m2);
	lock_guard<mutex> lg1(m1, adopt_lock);
	lock_gurad<mutex> lg2(m2, adopt_lock);
}

try_lock()不会引起阻塞,当所有mutex对象都被成功锁定后返回-1,否则返回第一个锁住失败的mutex对象下标。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值