C++ std::lock_guard 使用指南:RAII 锁管理
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 的步骤如下:
- 创建一个符合 Lockable 概念的类型对象(例如 'std::mutex');
- 创建一个 'std::lock_guard' 对象,将 Lockable 类型对象作为参数传入;
- 在需要使用锁的代码块中,通过 'std::lock_guard' 对象的成员函数 'lock()' 获取锁;
- 在代码块结束时,'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' 对象的生命周期与锁的获取和释放是一一对应的,不需要手动管理锁的状态。
原文地址: https://www.cveoy.top/t/topic/kWfb 著作权归作者所有。请勿转载和采集!