自动加锁类和自动解锁类

 自动回锁类

// A helper class that acquires the given Lock while the AutoLock is in scope.
class AutoLock {
 public:
  explicit AutoLock(Lock& lock) : lock_(lock) {
    lock_.Acquire();
  }

  ~AutoLock() {
    lock_.AssertAcquired();
    lock_.Release();
  }

 private:
  Lock& lock_;
  DISALLOW_COPY_AND_ASSIGN(AutoLock);
};

 

自动解锁类

class AutoUnlock {
 public:
  explicit AutoUnlock(Lock& lock) : lock_(lock) {
    // We require our caller to have the lock.
    lock_.AssertAcquired();
    lock_.Release();
  }

  ~AutoUnlock() {
    lock_.Acquire();
  }

 private:
  Lock& lock_;
  DISALLOW_COPY_AND_ASSIGN(AutoUnlock);
};

在C++中,手动加锁解锁通常使用互斥锁(`std::mutex`)及其相关的成员函数来实现,以下是几种常见的方式: ### 使用 `std::mutex` 的 `lock()` `unlock()` 方法 `std::mutex` 是C++标准库中最基本的互斥锁型,通过调用 `lock()` 方法加锁,`unlock()` 方法解锁。示例代码如下: ```cpp #include <iostream> #include <thread> #include <mutex> std::mutex mtx; void print_block(int n, char c) { mtx.lock(); for (int i = 0; i < n; ++i) { std::cout << c; } std::cout << '\n'; mtx.unlock(); } int main() { std::thread t1(print_block, 50, '*'); std::thread t2(print_block, 50, '$'); t1.join(); t2.join(); return 0; } ``` 在上述代码中,`print_block` 函数使用 `mtx.lock()` 加锁,确保在输出字符块时不会被其他线程干扰,操作完成后使用 `mtx.unlock()` 解锁,释放对资源的占用。 ### 使用 `std::unique_lock` 手动控制锁 `std::unique_lock` 比 `std::lock_guard` 更加灵活,支持手动加锁解锁操作。可以通过构造函数的参数来控制锁的初始状态,如 `std::defer_lock` 表示初始化时不进行加锁,需要手动调用 `lock()` 方法加锁。示例代码如下: ```cpp #include <iostream> #include <thread> #include <mutex> std::mutex mtx; void increment_counter(int id) { std::unique_lock<std::mutex> lock(mtx, std::defer_lock); // 做一些其他工作… lock.lock(); for (int i = 0; i < 1000; ++i) { std::cout << "Thread " << id << " is working" << std::endl; } // 可以在此处手动解锁 lock.unlock(); // 其他代码 lock.lock(); std::cout << "Thread " << id << " finished" << std::endl; // lock对象离开作用域时自动释放锁 } int main() { std::thread t1(increment_counter, 1); std::thread t2(increment_counter, 2); t1.join(); t2.join(); return 0; } ``` 在这个示例中,`std::unique_lock` 初始化为延迟加锁状态,在需要的时候手动调用 `lock()` 加锁,也可以在合适的时机手动调用 `unlock()` 解锁,提高了锁的使用灵活性 [^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值