C++ 独占锁

独占锁是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++同步工具中非常重要的一项技术,但是也需要谨慎使用,才能发挥最大效用。