lock_guard 和 unique_lock

默认分类 · 2024-06-18 · 131 人浏览
  • 头文件
    #include <mutex>
  • lock_guard
    守卫锁 通过 RAII 机制: 创造对象的时候加锁,离开作用域的时候解锁;保证了在它的作用域内都是加锁的,也省去了我们手动加锁解锁的麻烦
    需要配合 mutex 使用
    示例

    #include <mutex>
    using namespace std;
    mutex m;
    int mian() {
      { // 在这个花括号的范围内, 是持有锁的
          lock_guard<mutex> lock(m);
          // do something...  
      } 
      return 0;
    }
  • unique_lock
    lock_guard 虽然lock_guard省去了我们手动加锁解锁的麻烦,但是不够灵活,unique_lock就解决了这个问题
    unique_lock 不仅有和lock_guard 一样的功能, 还可以手动的加锁和解锁
    示例

    #include <mutex>
    using namespace std;
    mutex m;
    int mian() {
        { // 在这个花括号的范围内, 是持有锁的
            unique_lock<mutex> lock(m);
            lock.unlock(); // 解锁
            lock.lock(); // 再次锁定
            lock.try_lock(); // 尝试锁定
        } 
        return 0;
    }

    unique_lock 还可以和condition_variable 配合使用

    #include <mutex>
    #include <condition_variable>
    using namespace std;
    mutex m;
    condition_variable cond;
    int mian() {
    
      unique_lock<mutex> lock(m);
    
      cond.wait(lock); // 等待条件变量
    
      return 0;
    }
Theme Jasmine by Kent Liao