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

发布时间:2023年12月25日

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是最简单的锁。

文章来源:https://blog.csdn.net/qq_54199287/article/details/135159240
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。