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区别示例相关推荐

  1. C++中的std::lock_guard和std::unique_lock

    std::lock_guard 这是最简单的一个管理锁的对象.只有构造和析构函数,在构造的时候加锁,析构的时候解锁,解锁后就不能使用该对象再加锁了.可以避免使用std::mutex时忘记解锁的情况,同 ...

  2. unique_lock与lock_guard区别

    使用方式 lock_guard: 没有提供加锁和解锁的接口. 通过构造函数和析构函数控制锁的作用范围,创造对象的时候加锁,离开作用域的时候解锁: unique_lock: 提供了lock()和unlo ...

  3. C++ folly库解读(三)Synchronized —— 比std::lock_guard/std::unique_lock更易用、功能更强大的同步机制

    目录 返利 www.cpa5.cn 传统同步方案的缺点 folly/Synchronized.h 简单使用 Synchronized的模板参数 withLock()/withRLock()/withW ...

  4. C++11中std::unique_lock的使用

    std::unique_lock为锁管理模板类,是对通用mutex的封装.std::unique_lock对象以独占所有权的方式(unique owership)管理mutex对象的上锁和解锁操作,即 ...

  5. Multi-thread--C++11中std::unique_lock的使用

    std::unique_lock为锁管理模板类,是对通用mutex的封装.std::unique_lock对象以独占所有权的方式(unique owership)管理mutex对象的上锁和解锁操作,即 ...

  6. C++之lock_guard和unique_lock自动加解锁区别

    一.std::unique_lock也可以提供自动加锁.解锁功能,比std::lock_guard更加灵活.1.std::lock_guard std::lock_guard是RAII模板类的简单实现 ...

  7. std::jthread与std::thread的区别

    特性上,std::jthread相比std::thread主要增加了以下两个功能: 1.std::jthread对象被destruct时,会自动调用join,等待其所表示的执行流结束. 2.支持外部请 ...

  8. std::make_unique和 std::make_shared区别

    区别1:分配除的指针,前者是不能赋值,只能move,后者可以赋值 区别2:前者使用智能指针数组,后者不行(因为后者分配出来的指针具有单一性) #include #include class A { p ...

  9. std::atomic和std::mutex区别

    ​std::atomic介绍​ ​模板类std::atomic是C++11提供的原子操作类型,头文件 #include<atomic>.​在多线程调用下,利用std::atomic可实现数 ...

最新文章

  1. [Life Sciences.AI]专栏介绍及内容分类(持续更新......)
  2. mysql数据库查询笔记_MySql数据库基础笔记(一)
  3. js 延迟几秒执行ifarme_Node.js调试之llnode篇
  4. uniapp 前端数据显示数据字典值 程序设计
  5. DevOps Master凤凰项目沙盘总结:大美的DevOps总结
  6. keras图像风格迁移
  7. Java Timer
  8. 只读更新全程图解教程(转)
  9. 老路《用得上的商学课》学习开篇(自序)
  10. ramdisk实践2:ramdisk制作以及解决传参问题的编程详解
  11. 在线工具:电脑怎么提取图片中的文字?图片如何转化为文字?
  12. linux 查找目录或文件 (详解)
  13. C++初级主题--名字空间域和类域
  14. MAIGO的同济题解2
  15. 论文阅读:(ICLR 2021) MULTIPLICATIVE FILTER NETWORKS
  16. 情绪的自我调节与控制
  17. alfafile中转站免费_中转站全集免费在线观看-手机看中转站HD完整版 - 穷TV_院线大片影视大全...
  18. CTeX下的WinEdt和GSview相关的破解和自动补足
  19. 蓝牙技术|华为手环7正式发布,智能可穿戴走向新征程
  20. 计算机技能大赛简报,技能大赛简报.doc

热门文章

  1. ResorceGovernor--基础和Demo
  2. 几个 ASP.NET 小技巧
  3. [网络安全自学篇] 五十七.PE文件逆向之什么是数字签名及Signtool签名工具详解(一)
  4. [python学习] 专题九.Mysql数据库编程基础知识
  5. iOS之深入解析Block的底层原理
  6. LeetCode Algorithm 268. 丢失的数字
  7. TypeError: sequence item 0: expected str instance, int found
  8. Django 使用 HttpResponse 返回 json 字符串显示 Unicode 编码
  9. 【内核驱动】 Kconfig简介
  10. 【Linux基础】 Redhat6.5中OpenOffice的安装