boost互斥锁_boost锁使用总结

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);         ///锁定

} ///解锁

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/555050.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 是如何实现四大隔离级别的?

MySQL 是如何实现四大隔离级别的&#xff1f; 在mvcc下&#xff0c;mysql中用到的锁还是共享锁和排他锁么&#xff1f;如果是的话&#xff0c;那么是怎样结合锁和mvcc来实现rc和rr隔离级别的呢&#xff1f;还有mysql中在ru隔离级别下&#xff0c;两个事务同时读取数据对象A&am…

无符号右移负数_关于负数的右移与无符号右移运算小结

对于带符号右移,若为负数,则在存储时首位表示符号位,其值为1,表示该值是负数的移位,在移位过程中,高位补1,若符号位是0,表示是正数,在移位过程中高位补零,两者的前提是符号位保持不变:对于负数的右移&#xff1a;因为负数在内存中是以补码形式存在的&#xff0c;所有首先根据负…

Linux命令 移动/复制文件/目录到指定目录下

1、同一个服务器下复制文件或文件夹 1.1 复制文件 复制文件&#xff1a;把1.txt 复制到根目录下的sbin目录 cp 文件名&#xff08;可带路径&#xff09;目标路径&#xff08;带路径&#xff09;如&#xff1a;cp 1.txt ~/sbin/1,2 复制目录 复制目录&#xff1a;把relea…

springboot2稳定版本_重要版本Spring Boot 2.3.0发布 - spring.io

重要版本Spring Boot 2.3.0于2020年5月15日发布&#xff0c;此版本增加了大量新功能和改进。有关完整的升级说明以及新的和值得注意的功能&#xff0c;请参阅发行说明。2.3的新功能依赖升级Spring Boot 2.3移至几个Spring项目的新版本&#xff1a;Spring Data NeumannSpring HA…

正则表达式——手机号

手机表达式&#xff1a; /^13[0-9]|14[579]|15[0-3,5-9]|16[6]|17[0135678]|18[0-9]|19[89])\d{8}$/ 可以校验 11为手机号&#xff0c;包含了大部分号段 座机表达式&#xff1a; /^(0[0-9]{2,3}-)?([2-9][0-9]{6,7})(-[0-9]{1,4}){0,1}$/可以校验 区号-电话-分机 上面两条…

Caused by: org.springframework.context.annotation.ConflictingBeanDefinitionException

异常信息&#xff1a; org.springframework.context.annotation.ConflictingBeanDefinitionException: Annotation-specified bean name BusinessAccountController for bean class [com.hs.BusinessAccountController] conflicts with existing, non-compatible bean definit…

c mysql web开发实例教程_Web开发(六)MySql

数据库简介数据库(DB)数据库(database&#xff0c;DB)是指长期存储在计算机内的&#xff0c;有组织&#xff0c;可共享的数据的集合。数据库中的数据按一定的数学模型组织、描述和存储&#xff0c;具有较小的冗余&#xff0c;较高的数据独立性和易扩展性&#xff0c;并可为各种…

Git——工作中使用命令详解

1、Linux常用命令 cd&#xff1a;改变目录cd…&#xff1a;返回上级目录pwd&#xff1a;显示当前目录clear&#xff1a;清屏ls&#xff1a;显示当前目录所有文件touch&#xff1a;添加文件rm&#xff1a;删除文件mkdir&#xff1a;新建文件夹rm -r&#xff1a;删除文件夹mv&am…

mac11.14 mysql_mysql 5.7 11 章 数据类型(1)

前言 这是 一篇mysql 5.7 官方手册的部分翻译&#xff0c;目的加强自己的理解 &#xff0c;和 提升英文水平。不保证质量&#xff0c;速度。部分我感觉没有多大用处的部分没有做翻译。英语手册地址 https://dev.mysql.com/doc/refman/5.7/en/data-types.html------------------…

Java中常见null简析

对于每一个Java程序员来说,null肯定是一个让人头痛的东西,今天就来总结一下Java中关于null的知识。 1.null不属于任何类型,可以被转换成任何类型,但是用instanceof永远返回false. 2.null永远不能和八大基本数据类型进行赋值运算等,否则不是编译出错,就是运行出错. 3.null可以…

怎么从mysql注册表删除用户_mysql 创建和删除用户

1.远程登录mysqlmysql -h ip -u root -p 密码2.创建用户格式&#xff1a;grant 权限 on 数据库.* to 用户名登录主机 identified by "密码"&#xff1b;例1&#xff1a;增加一个test1用户&#xff0c;密码为123456&#xff0c;可以在任何主机上登录&#xff0c;并对所…

服务报错:java.sql.SQLException: Field ‘***‘ doesn‘t have a default value

完整异常 java.lang.RuntimeException: org.springframework.dao.DataIntegrityViolationException:Error updating database. Cause: java.sql.SQLException: Field ‘***’ doesn’t have a default value 问题原因 后端接实体类无默认值&#xff0c;但是前端未传参&#xf…

centos php-mysql_centOS 下安装php和mysql

使用yum install php,yum install mysql安装apache:yum install httpd httpd-devel启动apache:/etc/init.d/httpd start此时输入服务器的IP地址&#xff0c;应该看到apache的服务页面&#xff0c;端口不用输&#xff0c;apache默认就是使用80端口安装mysql:yum install mysql m…

Chrome浏览器F5和ctrl+F5的区别

一、正常重新加载&#xff08;F5&#xff0c;Ctrl R&#xff0c;在地址栏回车&#xff0c;点击链接&#xff09; 本节中的操作&#xff1a;根据缓存的缓存策略&#xff0c;进行处理。如果缓存没过期&#xff0c;就不向浏览器发请求&#xff0c;而是直接使用缓存。 F5或Contr…

mysql 自动生成mapper_自动生成实体类、Mapper、Mapper.xml文件

自动生成实体类、Mapper、Mapper.xml文件搭建Spring Boot Mysql MyBatis 项目核心配置pom.xml创建表配置文件生成文件结果项目结构搭建Spring Boot Mysql MyBatis 项目idea 可直接创建相应的项目及配置核心配置pom.xmlmysqlmysql-connector-java5.1.38org.springframework.…

使用Postman进行简单压力测试

使用Postman可以对服务端接口进行简单的压力测试&#xff0c;步骤如下&#xff1a; 1.配置好一个请求接口&#xff0c;保存在一个collection中&#xff1b; 2.点击Tests&#xff0c;添加断言检查点&#xff1b; 3.点击Runner按钮&#xff0c;打开Collection Runner界面&#…

mysql取消主从配置_mysql主从配置

搭建环境&#xff1a;master 192.168.127.131slave 192.168.127.128主从配置的前提&#xff1a;两个数据库的数据需要一模一样所以我们&#xff1a;在主上面建立一个数据库 在这里我们用mysql备份一下mysqldump db1 >123.sql (备份)在主上面建立一个数据库db1需要登录数据…

HTTP状态码——413

status code&#xff1a;413 Request Entiry Too large上传文件失败&#xff0c;报上面的错&#xff1a;请求实体太大。 原因&#xff1a;nginx有个参数client_max_body_size在限制请求实体的大小&#xff0c;把它改大点就好了。 {如果配置文件没有这个参数&#xff0c;应该会…

利用Java zip进行对文件的压缩和解压

利用Java JDK自带 进行对文件的压缩和解压 实现一个文件的zip压缩&#xff0c;过程可以简单地表示为&#xff1a; ZipEntry:表示 ZIP 文件条目 构造方法: public ZipEntry(String name) 可以用文件的相对路径来构造ZipEntry对象 ZipOutputStream&#xff1a; ZIP 文件格式…

mysql数据库设计教材_mySQL教程 第1章 数据库设计

E-R设计很多同学在学SQL语句时&#xff0c;觉得非常困难&#xff0c;那是因为你在学一个你根本不了解的数据库&#xff0c;数据库中的表不是你设计的&#xff0c;表与表之间的关系你不明白。因此在学SQL语句之前&#xff0c;先介绍一下数据库设计。下面举例说明数据库设计&…