独占锁是C++多线程编程中实现同步访问资源的机制之一。
一、unique_lock
C++11提供了unique_lock作为RAII方式的独占锁:
mutex m; // 创建mutex
unique_lock<mutex> lck(m); // 对mutex加锁
// 访问共享资源
lck.unlock(); // 解锁
利用RAII自动加锁解锁,无需自己实现lock/unlock逻辑。
二、lock_guard
lock_guard也是一种RAII锁:
mutex m;
lock_guard<mutex> lck(m); // 构造时lock,析构时unlock
lock_guard是一个非拷贝非移动的锁。
三、与std::lock
std::lock可以手动对mutex加解锁:
mutex m;
m.lock();
// 临界区
m.unlock();
需要自行控制好加锁解锁的时机,不如unique_lock自动。
四、死锁问题
独占锁可能造成优先级反转和死锁,需要慎用。
五、读写锁
shared_mutex可以实现多读单写锁。
六、用法示例
mutex m;
unique_lock<mutex> lck(m);
// 访问共享资源
lck.unlock();
独占锁是C++同步工具中非常重要的一项技术,但是也需要谨慎使用,才能发挥最大效用。