std::lock_guard

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

简单的实例:

#include <iostream>
#include <thread>
#include <mutex>
#include <vector>
#include <stdexcept>std::mutex mtx;void print_even(int n) {if(n % 2 == 0) {std::cout << n << " is even\n";} else {throw std::logic_error("not even\n");}
}void print_thread_id(int id) {try {// 在这里,try块是单独一个部分,离开块之后,锁就自动析构了std::lock_guard<std::mutex>lck(mtx);print_even(id);} catch(std::logic_error&) {std::cout << "[exception caught]\n";}
}int main() {// 创建线程组std::vector<std::thread>threads;for(int i = 0; i < 10; ++i) {threads.emplace_back(std::thread(print_thread_id, i + 1));}// 所有线程等待归并for(auto& th : threads) {th.join();}return 0;
}
/*
输出结果:
[exception caught]
2 is even
[exception caught]
4 is even
[exception caught]
6 is even
[exception caught]
8 is even
[exception caught]
10 is even
*/

std::unique_lock

拥有std::lock_guard所有的功能,但是更加灵活,也有更多的接口;时间和空间要求也更高了。

给出常用的5个构造函数:

unique_lock() noexcept;                                   // (1)
explicit unique_lock (mutex_type& m);                     // (2)
unique_lock (mutex_type& m, try_to_lock_t tag);           // (3)
unique_lock (mutex_type& m, defer_lock_t tag) noexcept;   // (4)
unique_lock (mutex_type& m, adopt_lock_t tag);            // (5)
  1. 仅仅定义一个对象,不管理任何锁对象
  2. 管理锁对象m,同时尝试调用m.lock()进行加锁,如果别的unique_lock已经管理了当前锁m,那么当前线程阻塞。
  3. 管理锁对象m,如果上锁失败,线程不会阻塞
  4. 管理锁对象m,初始化的时候不会锁住m
  5. 管理锁对象m,而且m应当是一个已经被当前线程锁住的Mutex对象

常用的成员函数:

  • try_lock上锁成功返回true,否则返回false
  • try_lock_for,调用管理对象的try_lock_for函数,成功返回true,失败返回false
  • try_lock_until,同try_lock_for
  • unlock,调用管理对象的unlock函数
  • release,返回管理锁的指针,并释放管理权
  • owns_lock,判断是否拥有了锁。

C++中的std::lock_guard和std::unique_lock相关推荐

  1. 【多线程】多线程锁住的是什么、std::lock_guard<std::mutex> locker(mutex_)

    通常不直接使用 mutex,lock_guard更加安全, 更加方便. lock_guard简化了 lock/unlock 的写法, lock_guard在构造时自动锁定互斥量, 而在退出作用域时会析 ...

  2. C++11中std::lock_guard的使用

    互斥类的最重要成员函数是lock()和unlock().在进入临界区时,执行lock()加锁操作,如果这时已经被其它线程锁住,则当前线程在此排队等待.退出临界区时,执行unlock()解锁操作.更好的 ...

  3. Multi-thread--C++11中std::lock_guard的使用

    互斥类的最重要成员函数是lock()和unlock().在进入临界区时,执行lock()加锁操作,如果这时已经被其它线程锁住,则当前线程在此排队等待.退出临界区时,执行unlock()解锁操作.更好的 ...

  4. std::unique_lock与std::lock_guard区别示例

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

  5. C++多线程中互斥量std::mutex与模板类std::lock_guard

    一. 互斥量std::mutex C++中通过实例化std::mutex创建互斥量实例,通过成员函数lock()对互斥量上锁,unlock()进行解锁.C++中与std::mutex相关的类(包括锁类 ...

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

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

  7. C++11 std::mutex使用以及std::lock_guard自动解锁避免忘记解锁

    文章目录 **std::mutex** std::mutex 的成员函数 示例 **std::lock_guard** std::mutex 头文件是<mutex>,mutex是用来保证线 ...

  8. std::lock_guard的原理和应用

    std::lock_guard的原理和应用 一.lock_guard 二.使用示例 三.原理分析 四.总结 一.lock_guard lock_guard是一种在作用域内控制可锁对象所有权的类型. ( ...

  9. std::lock_guard使用案例及常用系统函数调用案例

    1)lock_guard有两个构造函数,使用方法如下(注意:一定要声明一个局部的lock_guard对象): std::mutex mtx; (1)一个参数的使用方法:lock_guard lock( ...

最新文章

  1. 在UI设计中如何正确使用颜色
  2. 看看40万程序猿怎么评论:对于程序员英语真的重要吗?
  3. 更新linux内核版本,求问Linux最新内核版本以及发布日期。
  4. 网站集成PayPal如何设置
  5. 最简单的c#Remoting编程
  6. php每个月头一天与最后一天,PHP获取每月第一天与最后一天
  7. Sentinel(十八)之注解支持
  8. 【web前端优化之图片模糊到清晰】看我QQ空间如何显示相片
  9. java catch中 return_JAVA中try、catch、finally带return的执行顺序总结
  10. python求单链表的长度_709. 设计链表(Python)
  11. php player baidu,BaiduPlayer.php
  12. GitHub账户注册流程及常见问题解析
  13. 强网杯2019(高明的黑客强网先锋上单)
  14. 0基础学前端开发,CSS盒子模型居中方法
  15. 0基础小学生做的网站
  16. 拜师————python基础入门——守破离学习法,海龟绘图,画出奥运五环图,day3
  17. opencv中直方图均衡函数cv::equalizeHist()的使用!!严格用程序进行了验证!
  18. android动画特效
  19. 命运赋——原文与译文
  20. 手把手编译基于恩智浦MCAL的工程

热门文章

  1. P11:经典卷积神经网络结构案例分析
  2. 数据结构 3-0 栈与队列总结
  3. AcWing1081.度的数量(数位DP)题解
  4. 【五级流水线CPU】—— 5. 转移指令(14条)
  5. ~~欧几里得算法(附模板题)
  6. 《南溪的目标检测学习笔记》——深度学习的假设
  7. python3.x中pip升级报错
  8. linux/ubuntu中制作deb安装包
  9. 【Linux】CentOS 7 安装Redis
  10. 【Angular 4】数据绑定