std::lock_guard 是 C++11 提供的一个 RAII(Resource Acquisition Is Initialization)风格的锁包装类,用于自动管理锁的获取和释放,避免了手动管理锁的繁琐和出错。

std::lock_guard 可以用于管理任何符合 Lockable 概念的类型,例如 'std::mutex'、'std::recursive_mutex'、'std::timed_mutex'、'std::recursive_timed_mutex' 等。

使用 std::lock_guard 的步骤如下:

  1. 创建一个符合 Lockable 概念的类型对象(例如 'std::mutex');
  2. 创建一个 'std::lock_guard' 对象,将 Lockable 类型对象作为参数传入;
  3. 在需要使用锁的代码块中,通过 'std::lock_guard' 对象的成员函数 'lock()' 获取锁;
  4. 在代码块结束时,'std::lock_guard' 对象析构时会自动调用成员函数 'unlock()' 释放锁。

示例代码:

#include <iostream>
#include <thread>
#include <mutex>

std::mutex g_mutex;

void thread_func(int id)
{
    std::lock_guard<std::mutex> lock(g_mutex);
    std::cout << "Thread " << id << " is running." << std::endl;
}

int main()
{
    std::thread t1(thread_func, 1);
    std::thread t2(thread_func, 2);
    t1.join();
    t2.join();
    return 0;
}

在上面的示例代码中,我们创建了一个 'std::mutex' 对象 'g_mutex',然后在两个线程中使用 'std::lock_guard' 对象 'lock' 来管理 'g_mutex' 的锁。当一个线程获取到锁时,另一个线程会被阻塞,直到锁被释放。

使用 'std::lock_guard' 可以有效地避免死锁和忘记释放锁等问题,因为 'std::lock_guard' 对象的生命周期与锁的获取和释放是一一对应的,不需要手动管理锁的状态。

C++ std::lock_guard 使用指南:RAII 锁管理

原文地址: https://www.cveoy.top/t/topic/kWfb 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录