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-06-26小白家庭 nas 搭建方案-icode9专业技术文章分享
- 2024-06-23AI大模型企业应用实战(14)-langchain的Embedding
- 2024-06-23AI大模型企业应用实战(15)-langchain核心组件
- 2024-06-23AI大模型企业应用实战(16)-langchain核心组件
- 2024-06-23AI 大模型企业应用实战(06)-初识LangChain
- 2024-06-19EntBot.ai: AI Website Chatbot for Product Guides and Development Doc
- 2024-06-17zero-shot-learning-definition-examples-comparison
- 2024-06-06Package Easy(基于 NSIS 的打包exe安装包工具)使用方法-icode9专业技术文章分享
- 2024-06-06基于 casdoor 的 ELK 开源登录认证解决方案: elk-auth-casdoor-icode9专业技术文章分享
- 2024-05-29Elasticsearch慢查询日志配置