C++ std::lock_guard和std::unique_lock
2022/1/19 20:55:20
本文主要是介绍C++ std::lock_guard和std::unique_lock,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
-
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
这篇关于C++ std::lock_guard和std::unique_lock的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-23增量更新怎么做?-icode9专业技术文章分享
- 2024-11-23压缩包加密方案有哪些?-icode9专业技术文章分享
- 2024-11-23用shell怎么写一个开机时自动同步远程仓库的代码?-icode9专业技术文章分享
- 2024-11-23webman可以同步自己的仓库吗?-icode9专业技术文章分享
- 2024-11-23在 Webman 中怎么判断是否有某命令进程正在运行?-icode9专业技术文章分享
- 2024-11-23如何重置new Swiper?-icode9专业技术文章分享
- 2024-11-23oss直传有什么好处?-icode9专业技术文章分享
- 2024-11-23如何将oss直传封装成一个组件在其他页面调用时都可以使用?-icode9专业技术文章分享
- 2024-11-23怎么使用laravel 11在代码里获取路由列表?-icode9专业技术文章分享
- 2024-11-22怎么实现ansible playbook 备份代码中命名包含时间戳功能?-icode9专业技术文章分享