博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
C++ 并发编程,std::unique_lock与std::lock_guard区别示例
阅读量:5785 次
发布时间:2019-06-18

本文共 1938 字,大约阅读时间需要 6 分钟。

背景

平时看代码时,也会使用到std::lock_guard,但是std::unique_lock用的比较少。在看并发编程,这里总结一下。方便后续使用。

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 
#include
#include
#include
#include
std::mutex my_lock;void add(int &num, int &sum){ while(true){ std::lock_guard
lock(my_lock); if (num < 100){ //运行条件 num += 1; sum += num; } else { //退出条件 break; } } }int main(){ int sum = 0; int num = 0; std::vector
ver; //保存线程的vector for(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)); //join std::cout << sum << std::endl;}

std::unique_lock

类 unique_lock 是通用互斥包装器,允许延迟锁定、锁定的有时限尝试、递归锁定、所有权转移和与条件变量一同使用

unique_lock比lock_guard使用更加灵活,功能更加强大。
使用unique_lock需要付出更多的时间、性能成本。

下面是try_lock的使用例子。

#include 
// std::cout#include
// std::thread#include
// std::mutex, std::unique_lock#include
std::mutex mtx; // mutex for critical sectionstd::once_flag flag;void print_block (int n, char c) { //unique_lock有多组构造函数, 这里std::defer_lock不设置锁状态 std::unique_lock
my_lock (mtx, std::defer_lock); //尝试加锁, 如果加锁成功则执行 //(适合定时执行一个job的场景, 一个线程执行就可以, 可以用更新时间戳辅助) if(my_lock.try_lock()){ for (int i=0; i
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;}

参考

转载地址:http://hvvyx.baihongyu.com/

你可能感兴趣的文章
领域驱动设计文章
查看>>
iview使用vue-i18n实现国际化
查看>>
刘强东:京东必定会击败阿里巴巴
查看>>
Bootstrap学习系列(一)之栅格系统概述
查看>>
异常处理(五)
查看>>
Quartz中时间表达式的设置-----corn表达式
查看>>
C#垃圾回收机制
查看>>
python调试
查看>>
Struts2重定向
查看>>
Akka学习博客
查看>>
[C#] 區分 abstract、virtual、override 和 new
查看>>
算法(4)—— 队列的链表实现
查看>>
hdu1827 强连通
查看>>
.net core web 中使用app.UseRouter的几种使用方式
查看>>
怎么查询展示年份
查看>>
Http协议中Get和Post的浅谈
查看>>
poj-3281【最大流】
查看>>
用网站(WebSite而不是WebProject)项目构建ASP.NET MVC网站
查看>>
硬盘参数之TLER
查看>>
SQL JOIN
查看>>