C++ 并发编程,std::unique_lock与std::lock_guard区别示例详解编程语言
2023-06-13 09:11:47 时间
平时看代码时,也会使用到std::lock_guard,但是std::unique_lock用的比较少。在看并发编程,这里总结一下。方便后续使用。
std::unique_lock也可以提供自动加锁、解锁功能,比std::lock_guard更加灵活。
std::lock_guardstd::lock_guard是RAII模板类的简单实现,功能简单。
1.std::lock_guard 在构造函数中进行加锁,析构函数中进行解锁。
2.锁在多线程编程中,使用较多,因此c++11提供了lock_guard模板类;在实际编程中,我们也可以根据自己的场景编写resource_guard RAII类,避免忘掉释放资源。
下面是一个使用std::lock_guard的代码例子,1+2+ .. + 100的多线程实现,每个num只能由一个线程处理。:
#include thread #include mutex #include vector #include iostream #include algorithm std::mutex my_lock; void add(int num, int sum){ while(true){ std::lock_guard std::mutex lock(my_lock); if (num 100){ //运行条件 num += 1; sum += num; else { //退出条件 break; int main(){ int sum = 0; int num = 0; std::vector std::thread ver; //保存线程的vector for(int i = 0; i ++i){ std::thread t = std::thread(add, std::ref(num), std::ref(sum)); ver.emplace_back(std::move(t)); //保存线程 std::for_each(ver.begin(), ver.end(), std::mem_fn( std::thread::join)); //join std::cout sum std::endl;std::unique_lock
类 unique_lock 是通用互斥包装器,允许延迟锁定、锁定的有时限尝试、递归锁定、所有权转移和与条件变量一同使用。
unique_lock比lock_guard使用更加灵活,功能更加强大。
使用unique_lock需要付出更多的时间、性能成本。
下面是try_lock的使用例子。
#include iostream // std::cout #include thread // std::thread #include mutex // std::mutex, std::unique_lock #include vector std::mutex mtx; // mutex for critical section std::once_flag flag; void print_block (int n, char c) { //unique_lock有多组构造函数, 这里std::defer_lock不设置锁状态 std::unique_lock std::mutex my_lock (mtx, std::defer_lock); //尝试加锁, 如果加锁成功则执行 //(适合定时执行一个job的场景, 一个线程执行就可以, 可以用更新时间戳辅助) if(my_lock.try_lock()){ for (int i=0; i ++i) std::cout c; std::cout /n; void run_one(int n){ std::call_once(flag, [ n]{n=n+1;}); //只执行一次, 适合延迟加载; 多线程static变量情况 int main () { std::vector std::thread ver; int num = 0; for (auto i = 0; i ++i){ ver.emplace_back(print_block,50,*); ver.emplace_back(run_one, std::ref(num)); for (auto t : ver){ t.join(); std::cout num std::endl; return 0;
原创文章,作者:Maggie-Hunter,如若转载,请注明出处:https://blog.ytso.com/17509.html
cgojava相关文章
- EasyC++72,赋值运算符
- c++语言截取字符串,详解C++ string常用截取字符串方法
- c++解决大整数乘法
- C++并发实战19:lock free编程
- 1788:Pell 数列 -- C++ 递推法
- QT(C++)面试总结
- c++获取子类窗口句柄位置_C++中各种获取窗口句柄的方法「建议收藏」
- 深入理解C++11_c++ string char
- c++ auto类型_auto C++
- C++stl库_c++库
- C++创建线程池_windows线程池iocp
- C++字符串加密_c++字符串连接函数
- C++ 中文周刊 第100期
- 【C++】类和对象 (下篇)
- c++基础篇之C++ 模板
- C++ normal_distribution高斯正态分布函数用法详解
- C++运算符重载的概念和原理
- C++ map,STL map详解
- VS Code运行C和C++程序
- C++中的函数指针与函数对象的总结
- VC++进度条processBar的用法实例