-
std::lock_guard
- lock_guard是采用RAII手法封装的一个类,功能与mutex一样
- 其在构造时自动对mutex进行锁定(lock),在析构函数中自动对mutex进行解锁(unlock)
// g++ main.cpp -lpthread #include <algorithm> #include <condition_variable> #include <list> #include <mutex> #include <queue> #include <thread> int main() { { std::mutex m; std::lock_guard<std::mutex> lockGuard(m); // std::lock_guard的构造函数被调用 加锁 int sharedVariable = 10; } // std::lock_guard的析构函数被调用 解锁 return 0; }
- std::unique_lock
std::unique_lock可传递的第二个参数:std::try_to_lock
你可以传递std::try_to_lock,表示尝试性对mutex进行加锁,如果加锁成功就返回true,如果加锁失败就不阻塞而直接返回false。代码如下:
#include <algorithm> #include <condition_variable> #include <list> #include <mutex> #include <queue> #include <thread> std::mutex m; int main() { { std::unique_lock<std::mutex> lock(m, std::try_to_lock); if (lock) { printf("try to lock ok\n"); } int sharedVariable = 10; } // std::unique_lock<std::mutex> 如果try_to_lock成功,lock的析构函数释放m,否则释放 return 0; }
- std::unique_lock可传递的第二个参数:std::adopt_lock
unique_lock也可以带std::adopt_lock标记,就是不希望再unique_lock()的构造函数中lock这个mutex。因为这个mutex已经被lock了
std::mutex m; int main() { { m.lock(); //必须先lock,否则报错 std::unique_lock<std::mutex> lock(m, std::adopt_lock); } return 0; }
- std::unique_lock可传递的第二个参数:std::defer_lock
std::defer_lock的意思就是并没有给mutex加锁:初始化了一个没有加锁的mutex。
std::mutex m; int main() { { std::unique_lock<std::mutex> lock(m, std::defer_lock); // //没有加锁的mutex m } return 0; }
参考:C++11多线程 unique_lock详解_u012507022的博客-CSDN博客_std::unique_lock