std::lock_guard自动加解锁

发布时间 2023-11-14 17:22:41作者: Toriyung

`std::lock_guard` 是 C++ 中用于管理 `std::mutex` 的 RAII(Resource Acquisition Is Initialization) 类之一。它的主要作用是帮助在获取 `std::mutex` 的所有权时自动对其进行加锁,并在作用域结束时自动解锁,从而避免了手动管理锁的加锁和解锁过程,有效地防止了忘记解锁锁的情况,提高了代码的安全性和可维护性。

`std::lock_guard` 对象在构造时会尝试锁定提供给它的 `std::mutex` 对象,并在其作用域结束时自动释放锁。这样做的好处是,在出现异常或者提前返回的情况下,也能确保锁能够被正确释放,从而避免了死锁等问题。


这段代码创建了一个名为 `lock` 的 `std::lock_guard` 对象,它通过 `g_mutex`(一个 `std::mutex` 对象)对其进行初始化。这会将 `g_mutex` 锁住,直到 `lock` 对象的作用域结束时自动释放 `g_mutex`。

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

std::mutex g_mutex;

void criticalSection() {
std::lock_guard<std::mutex> lock(g_mutex);
// 在这里进行需要互斥访问的临界区代码
// g_mutex 在这里被锁定
std::cout << "Inside critical section" << std::endl;
// g_mutex 在 lock 离开作用域时被解锁
}

int main() {
std::thread t1(criticalSection);
std::thread t2(criticalSection);

t1.join();
t2.join();

return 0;
}

 

这样,`std::lock_guard` 确保了在 `criticalSection` 中的临界区代码能够被互斥访问,同时也确保了在离开临界区时,`g_mutex` 能够被正确地释放。

 

 

 

 

From ChatGPT3.5