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
提供了更灵活的上锁和解锁方式。它在构造时可以选择是否上锁,而在析构时会根据构造时的状态决定是否解锁。这种方式允许在锁住的期间手动解锁,并在需要时手动重新上锁,提供了更大的灵活性。
适用于复杂场景: 适用于需要在进入临界区时锁住互斥量,但在一些条件下可能需要提前解锁,然后重新锁定互斥量的复杂场景。
#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是最简单的锁。