std::unique_lock与std::lock_guard区别示例
std::unique_lock也可以提供自动加锁、解锁功能,比std::lock_guard更加灵活。
std::lock_guard
std::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; //保存线程的vectorfor(int i = 0; i < 20; ++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)); //joinstd::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<n; ++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 < 10; ++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;
}
参考
- 自解锁lock_guard_远方-CSDN博客
- std::unique_lock - cppreference.com
std::unique_lock与std::lock_guard区别示例相关推荐
- C++中的std::lock_guard和std::unique_lock
std::lock_guard 这是最简单的一个管理锁的对象.只有构造和析构函数,在构造的时候加锁,析构的时候解锁,解锁后就不能使用该对象再加锁了.可以避免使用std::mutex时忘记解锁的情况,同 ...
- unique_lock与lock_guard区别
使用方式 lock_guard: 没有提供加锁和解锁的接口. 通过构造函数和析构函数控制锁的作用范围,创造对象的时候加锁,离开作用域的时候解锁: unique_lock: 提供了lock()和unlo ...
- C++ folly库解读(三)Synchronized —— 比std::lock_guard/std::unique_lock更易用、功能更强大的同步机制
目录 返利 www.cpa5.cn 传统同步方案的缺点 folly/Synchronized.h 简单使用 Synchronized的模板参数 withLock()/withRLock()/withW ...
- C++11中std::unique_lock的使用
std::unique_lock为锁管理模板类,是对通用mutex的封装.std::unique_lock对象以独占所有权的方式(unique owership)管理mutex对象的上锁和解锁操作,即 ...
- Multi-thread--C++11中std::unique_lock的使用
std::unique_lock为锁管理模板类,是对通用mutex的封装.std::unique_lock对象以独占所有权的方式(unique owership)管理mutex对象的上锁和解锁操作,即 ...
- C++之lock_guard和unique_lock自动加解锁区别
一.std::unique_lock也可以提供自动加锁.解锁功能,比std::lock_guard更加灵活.1.std::lock_guard std::lock_guard是RAII模板类的简单实现 ...
- std::jthread与std::thread的区别
特性上,std::jthread相比std::thread主要增加了以下两个功能: 1.std::jthread对象被destruct时,会自动调用join,等待其所表示的执行流结束. 2.支持外部请 ...
- std::make_unique和 std::make_shared区别
区别1:分配除的指针,前者是不能赋值,只能move,后者可以赋值 区别2:前者使用智能指针数组,后者不行(因为后者分配出来的指针具有单一性) #include #include class A { p ...
- std::atomic和std::mutex区别
std::atomic介绍 模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>.在多线程调用下,利用std::atomic可实现数 ...
最新文章
- [Life Sciences.AI]专栏介绍及内容分类(持续更新......)
- mysql数据库查询笔记_MySql数据库基础笔记(一)
- js 延迟几秒执行ifarme_Node.js调试之llnode篇
- uniapp 前端数据显示数据字典值 程序设计
- DevOps Master凤凰项目沙盘总结:大美的DevOps总结
- keras图像风格迁移
- Java Timer
- 只读更新全程图解教程(转)
- 老路《用得上的商学课》学习开篇(自序)
- ramdisk实践2:ramdisk制作以及解决传参问题的编程详解
- 在线工具:电脑怎么提取图片中的文字?图片如何转化为文字?
- linux 查找目录或文件 (详解)
- C++初级主题--名字空间域和类域
- MAIGO的同济题解2
- 论文阅读:(ICLR 2021) MULTIPLICATIVE FILTER NETWORKS
- 情绪的自我调节与控制
- alfafile中转站免费_中转站全集免费在线观看-手机看中转站HD完整版 - 穷TV_院线大片影视大全...
- CTeX下的WinEdt和GSview相关的破解和自动补足
- 蓝牙技术|华为手环7正式发布,智能可穿戴走向新征程
- 计算机技能大赛简报,技能大赛简报.doc
热门文章
- ResorceGovernor--基础和Demo
- 几个 ASP.NET 小技巧
- [网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)
- [python学习] 专题九.Mysql数据库编程基础知识
- iOS之深入解析Block的底层原理
- LeetCode Algorithm 268. 丢失的数字
- TypeError: sequence item 0: expected str instance, int found
- Django 使用 HttpResponse 返回 json 字符串显示 Unicode 编码
- 【内核驱动】 Kconfig简介
- 【Linux基础】 Redhat6.5中OpenOffice的安装