boost锁的概述:

boost库中提供了mutex类与lock类,通过组合可以轻易的构建读写锁与互斥锁。

举个通俗的例子,如果共享资源是一个自动锁住的房间,互斥体是钥匙,进入房间必须取钥匙,离开房间应该还钥匙。这就对应着互斥体的lock(取钥匙)和unlock(还钥匙)。

动态分配内存存在类似的情况。如果忘记delete,会导致内存泄漏。它是如何解决的?在栈上分配对象,要一个特点,那就是离开作用域后,对象肯定要调用析构方法。利用这个特点,可以使用对象对指针封装,在对象的析构方法中进行delete,就保证了一定会执行delete。这就是智能指针。因为智能指针,不是针对一个特定类型的指针,因此把智能指针设计为类的模版,根据模版实参特例化一个模板类。同样道理,也可以使用相同技术,对互斥体封装。这就是lock类模版。在lock的构造方法调用互斥体的lock方法,在lock的析构方法调用互斥体的unlock方法。mutex是对象类,lock是模板类。

mutex对象类:

mutex类主要有两种:boost::mutex,boost::shared_mutex,其中mutex有lock和unlock方法,shared_mutex除了提供lock和unlock方法外,还有shared_lock和shared_unlock方法。因此,boost::mutex为独占互斥类,boost::shared_mutex为共享互斥类。

lock模板类:

boost::unique_lock,boost::shared_lock,其中unique_lock为独占锁,shared_lock为共享锁。unique_lock中的T可以为mutex类中的任意一种,如果为shared_mutex,那么boost::unique_lock<:shared_mutex>类的对象构造函数构造时,会自动调用shared_mutex的shared_lock方法,析构函数里,会自动调用shared_mutex的shared_unlock方法。如果是boost::

unique_lock<:mutex>,则分别自动调用lock和unlock方法。

boost::shared_lock中的T只能是shared_mutex类。

读写锁的实现:

typedefboost::shared_lock<:shared_mutex> readLock;

typedef boost::unique_lock<:shared_mutex> writeLock;

boost::shared_mutex rwmutex;

void readOnly( )

{

readLock  rdlock( rwmutex );

/// do something

}

void writeOnly( )

{

writeLock  wtlock( rwmutex );

/// do something

}

对同一个rwmutex,线程可以同时有多个readLock,这些readLock会阻塞任意一个企图获得writeLock的线程,直到所有的readLock对象都析构。如果writeLock首先获得了rwmutex,那么它会阻塞任意一个企图在rwmutex上获得readLock或者writeLock的线程。boost::shared_lock使用要小心,千万不要同一个线程多次进入。

互斥锁的实现:

typedef boost::unique_lock<:mutex> exclusiveLock;

递归式的互斥量:

boost::recursive_mutex提供一个递归式的互斥量。对于一个实例最多允许一个线程拥有其锁定,如果一个线程已经锁定一个boost::recursive_mutex实例,那么这个线程可以多次锁定这个实例。

boost::mutex::scoped_lock

boost::mutexio_mutex;

void foo( )

{

{

boost::mutex::scoped_lock lock( io_mutex);         ///锁定

} ///解锁

}

boost互斥锁_boost锁使用总结相关推荐

  1. boost 递归锁_c++/boost互斥量与锁

    线程之间的锁有:互斥锁.读写锁.递归锁.自旋锁.一般而言,锁的功能越强大,性能就会越低. std::mutex-互斥锁 互斥锁用于控制多个线程对他们之间共享资源互斥访问的一个信号量.也就是说是为了避免 ...

  2. Linux多线程(线程互斥与线程锁)

    文章目录 一.基本概念 二.互斥与同步 三.线程安全问题的底层原因 (1)抢票逻辑 (2)底层原理 四.线程锁 1.锁的使用 (1)初始化和销毁 (2)加锁和解锁 2.抢票逻辑 3.锁的原理 五.死锁 ...

  3. 你了解多线程自旋锁、互斥锁、递归锁等锁吗?

    首先看一下问题引出,先看一些经典的问题. 多线程的隐患 首先我们利用多线程的话肯定是好处多多,因为我们可以同时去做一些事情,大大的提高了效率.像我们下载视频的时候就可以同时下载多个视频,这样是节省了很 ...

  4. POSIX互斥锁自旋锁

    基础组件-POSIX互斥锁自旋锁 基础组件 基础组件-POSIX互斥锁自旋锁 前言 一.互斥锁 二.自旋锁 特点: 场景: 使用原则 自旋锁属性 三.两把锁的区别 1. 调度策略 2.使用场景 四.常 ...

  5. 什么是自旋锁+自旋锁和互斥锁的区别

    文章目录 本文链接 什么是自旋锁 参考链接 自旋锁和互斥锁的区别 参考链接 本文链接 击打 什么是自旋锁 多线程对共享资源访问, 为防止并发引起的相关问题, 常引入锁的机制来处理并发问题.   获取到 ...

  6. [精选]MySQL的各种锁(表锁,行锁,悲观锁,乐观锁,间隙锁,死锁)

    不少人在开发的时候,应该很少会注意到这些锁的问题,也很少会给程序加锁(除了库存这些对数量准确性要求极高的情况下),即使我们不会这些锁知识,我们的程序在一般情况下还是可以跑得好好的.因为数据库隐式帮我们 ...

  7. jvm第7节-锁(偏向锁,轻量锁,自旋锁)

    为什么80%的码农都做不了架构师?>>>    在介绍锁之前我们先介绍一个线程不安全的例子,一个全局的list,开2个线程往里面插入数据,代码如下: package com.jvm. ...

  8. 《Redis官方文档》用Redis构建分布式锁(悲观锁)

    2019独角兽企业重金招聘Python工程师标准>>> **用Redis构建分布式锁 ** 在不同进程需要互斥地访问共享资源时,分布式锁是一种非常有用的技术手段. 有很多三方库和文章 ...

  9. java多线程之锁 -- 偏向锁、轻量级锁、自旋锁、重量级锁

    转载至:https://blog.csdn.net/zqz_zqz/article/details/70233767 之前做过一个测试,详情见这篇文章<多线程 +1操作的几种实现方式,及效率对比 ...

最新文章

  1. centos8安装KVM/QEUM虚拟化
  2. php弹出消息翻页,一个很不错的PHP翻页类
  3. linux系统管理与服务器配置高志君_如何在 Linux 上安装、配置 NTP 服务器和客户端?...
  4. 计算机硬件技术基础5章在线,《计算机硬件技术基础》试题(D)
  5. html文档定义层标记是,jsp练习题目201312
  6. Event用计算机语言,求高人解释下一段计算机语言。
  7. 基于c++11新标准开发一个支持多线程高并发的网络库
  8. 项目经理杂谈(上)____________加速步伐!
  9. 史上最实用mysql参数之一-----sql_safe_updates
  10. 集群、分布式、集中式、伪分布式的概念与区别
  11. 项目管理文档_项目管理和团队协同的轻量级工具——PMS,来了
  12. java检查页面ajax请求,Java AJAX电子邮件检验示例
  13. ubuntu 18.04 安装teamview(包括正常的安装教程,以及一个纯终端教程)
  14. 上位机和下位机通信故障判断方法
  15. revit打开服务器文件格式,Revit文件导出格式大全(下)
  16. Win10 外接显示器,Chrome花屏/视频全屏黑屏解决方法
  17. html text-decoration,text-decoration 属性
  18. QQ群龙王快速获得代码以及方法
  19. 这家公司用AI生成颠覆内容创作!
  20. java中系统托盘的实现

热门文章

  1. java enummap_Java EnumMap get()方法与示例
  2. Python | Lambda函数与示例
  3. java输出不同颜色_Java设计模式-策略模式、状态模式
  4. c语言案例朗读工具源码,C语言编写简单朗读小工具(有源码)
  5. mysql验证身份证号正确_通过SQL校验身份证号码是否正确
  6. access 导入txt 找不到可安装的isam_由浅入深:Python 中如何实现自动导入缺失的库?...
  7. Java LocalDate类| 带示例的getEra()方法
  8. 在CSS中使用not:first-child选择器
  9. Java RandomAccessFile writeLong()方法与示例
  10. 认识和选购极致的显示器