【C++多线程编程】(十)之 lock_guard与unique_lock的区别

std::lock_guard

  • 自动上锁和解锁: std::lock_guard 是一个轻量级的 RAII(资源获取即初始化)风格的类,它在构造时自动上锁,而在析构时自动解锁。一旦 std::lock_guard 对象被创建,它就会自动锁住互斥量,并在其作用域结束时释放锁。不能中途解锁,必须等作用域结束才解锁。
  • 适用于简单场景: 适用于对互斥量进行独占式访问的简单场景。因为 std::lock_guard 的灵活性相对较低,适用于那些在进入临界区时就要锁住,且在退出临界区时就要解锁的场景。
#include <mutex>

std::mutex myMutex;

void someFunction()
{
    std::lock_guard<std::mutex> lock(myMutex); // 自动上锁

    // 在这里进行对共享资源的访问或修改

} // lock_guard 在这里离开作用域,自动释放锁

std::unique_lock

  • 手动上锁和解锁: std::unique_lock 提供了更灵活的上锁和解锁方式。它在构造时可以选择是否上锁,而在析构时会根据构造时的状态决定是否解锁。这种方式允许在锁住的期间手动解锁,并在需要时手动重新上锁,提供了更大的灵活性。

  • 适用于复杂场景: 适用于需要在进入临界区时锁住互斥量,但在一些条件下可能需要提前解锁,然后重新锁定互斥量的复杂场景。

#include <mutex>

std::mutex myMutex;

void someFunction()
{
    std::unique_lock<std::mutex> lock(myMutex); // 手动上锁

    // 在这里进行对共享资源的访问或修改

    lock.unlock(); // 手动解锁

    // 在这里执行一些不需要互斥量保护的操作

    lock.lock(); // 手动重新锁定

    // 在这里继续进行对共享资源的访问或修改

} // unique_lock 在这里离开作用域,根据情况自动或手动释放锁

所有 lock_guard 能够做到的事情,都可以使用 unique_lock 做到,反之则不然。那么何时使lock_guard呢?很简单,需要使用锁的时候,首先考虑使用 lock_guard,因为lock_guard是最简单的锁。

  • 20
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SensizliKLoU

感谢您的慷慨支持和鼓励!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值