std::lock_guard的介绍(包含使用示例)

std::lock_guard 是 C++11 标准库中提供的一个模板类,用于简化互斥锁的管理,它利用了 RAII(资源获取即初始化)技术,确保在作用域结束时自动释放锁。

主要特点

  1. 自动加锁和解锁std::lock_guard 的构造函数会自动调用互斥锁的 lock() 方法来加锁,而析构函数会自动调用 unlock() 方法来解锁。
  2. 防止死锁:由于 std::lock_guard 会在析构时自动释放锁,因此可以有效避免因忘记手动解锁而导致的死锁问题。
  3. 异常安全:即使在加锁的代码块中发生异常,std::lock_guard 也会在析构时正确释放锁。

构造函数

  • 普通加锁explicit lock_guard(mutex_type& m),构造时对互斥锁 m 加锁。
  • 采用已加锁lock_guard(mutex_type& m, std::adopt_lock_t tag),假设互斥锁已经被当前线程加锁,std::lock_guard 不会再次加锁,而是接管锁的管理。

使用示例

示例 1:普通加锁
#include 
#include 
#include 

std::mutex mtx;

void print_thread_id(int id) {
    std::lock_guard<std::mutex> lock(mtx); // 自动加锁
    std::cout << "Thread #" << id << " is running\n";
} // lock_guard 析构,自动解锁

int main() {
    std::thread threads[10];
    for (int i = 0; i < 10; ++i) {
        threads[i] = std::thread(print_thread_id, i + 1);
    }
    for (auto& th : threads) {
        th.join();
    }
    return 0;
}

在这个示例中,std::lock_guard 在构造时自动对 mtx 加锁,当 lock_guard 对象超出作用域时,会自动解锁。

  • 执行结果

std::lock_guard的介绍(包含使用示例)_第1张图片

示例 2:采用已加锁
#include 
#include 
#include 

std::mutex mtx;

void print_thread_id(int id) {
    mtx.lock(); // 手动加锁
    std::lock_guard<std::mutex> lock(mtx, std::adopt_lock); // 采用已加锁
    std::cout << "Thread #" << id << " is running\n";
} // lock_guard 析构,自动解锁

int main() {
    std::thread threads[10];
    for (int i = 0; i < 10; ++i) {
        threads[i] = std::thread(print_thread_id, i + 1);
    }
    for (auto& th : threads) {
        th.join();
    }
    return 0;
}

在这个示例中,互斥锁 mtx 已经被手动加锁,std::lock_guard 使用 std::adopt_lock 标志接管锁的管理。

  • 执行结果

std::lock_guard的介绍(包含使用示例)_第2张图片

注意事项

  • std::lock_guard 的拷贝构造和移动构造都被禁用,因此不能拷贝或移动 std::lock_guard 对象。
  • 如果需要更复杂的锁管理(如尝试加锁、定时加锁等),可以使用 std::unique_lock

你可能感兴趣的:(c++,harmonyos,c++)