- 头文件
#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; }