c++ std::unique_lock的递归锁定机制

std::unique_lock 支持的特性之一就是递归锁定机制,也称可重入锁。这允许使用同一个线程在不解除锁定情况下多次锁定互斥锁。

在递归锁定期间,线程可以继续尝试重新获取同个互斥锁。如果在这种情况下,通过 std::unique_lock 在第一次请求时已经锁定了该互斥锁,则该锁只会增加其内部计数器,以记住要释放几次互斥锁。

递归锁的基本语法如下:


#include <mutex>

void func(std::mutex& m)
{
    std::unique_lock<std::mutex> lk(m);
    /* do some work */
    func(m); // 递归调用(或调用其他函数)并再次锁定互斥量
}

在上面的代码中,func 函数使用 std::unique_lock 锁定了一个互斥量,然后执行一些工作,最重要的是该函数通过递归调用来再次锁定互斥量。

当 func 函数再次被调用时,它将尝试重复锁定互斥量。但由于该互斥量已经被锁定,因此只会将其内部状态计数器值增加 1(即使是在另一个线程中)。然后它会执行该函数的其他操作。再次调用其他操作将重复并递归锁定互斥锁。

在递归锁定情况下,需要注意锁的释放次数。每个 std::lock() 或 unlock() 的调用都必须与之前的调用相同数量,以确保在相应数量的锁定和解锁操作之后,因此才能准确的解除所有的锁定。

需要注意的是,在使用递归锁时要小心,因为过多的循环可能导致程序死锁、性能抖动等问题。因此,只有在充分理解可重入锁概念和隐式锁机制的前提下,才能安全地使用递归锁定机制来编写多线程代码。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值