62 C++ 多线程 -- mutex互斥量只能使用一次的问题分析-----以及解决方案递归mutex:recursive_mutex。

本文主要是介绍62 C++ 多线程 -- mutex互斥量只能使用一次的问题分析-----以及解决方案递归mutex:recursive_mutex。,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

一 前提 以及问题

我们注意到,如果mutex.lock()两次,就会有问题
 

如下的代码有runtime exception

mutex mymutex;mymutex.lock();mymutex.lock();//共享数据访问处理代码mymutex.unlock();mymutex.unlock();

但是有这样的case存在

class Teacher183 {
public:mutex mymutex;int num;int othernum;//1月份的时候,有个需求,我们写了个func1,共享数据num的访问,用mymutex保护void func1() {mymutex.lock();num++;mymutex.unlock();}//3月份的时候,公司有个新需求,我们写了个func1,共享数据othernum的访问,用mymutex保护void func2() {mymutex.lock();othernum++;mymutex.unlock();}//5月份的时候,公司有了一个新需求,这个需求,有一部分代码用到了func1和func2,那么我们按照习惯会这么写:void func3() {mymutex.lock();//func3 代码func1();// func3 代码func2();mymutex.unlock();//func3 代码}};void main() {Teacher183 tea;thread functhread1(&Teacher183::func1, &tea);thread functhread2(&Teacher183::func2, &tea);thread functhread3(&Teacher183::func3, &tea);functhread1.join();functhread2.join();functhread3.join();
}

二。recursive_mutex--可以多次lock()写在一起,多次unlock()写在一起

class Teacher183 {
public:recursive_mutex mymutex;int num;int othernum;//1月份的时候,有个需求,我们写了个func1,共享数据num的访问,用mymutex保护void func1() {mymutex.lock();num++;mymutex.unlock();}//3月份的时候,公司有个新需求,我们写了个func1,共享数据othernum的访问,用mymutex保护void func2() {mymutex.lock();othernum++;mymutex.unlock();}//5月份的时候,公司有了一个新需求,这个需求,有一部分代码用到了func1和func2,那么我们按照习惯会这么写:void func3() {mymutex.lock();//func3 代码func1();// func3 代码func2();mymutex.unlock();//func3 代码}};void main() {Teacher183 tea;thread functhread1(&Teacher183::func1, &tea);thread functhread2(&Teacher183::func2, &tea);thread functhread3(&Teacher183::func3, &tea);functhread1.join();functhread2.join();functhread3.join();
}

这篇关于62 C++ 多线程 -- mutex互斥量只能使用一次的问题分析-----以及解决方案递归mutex:recursive_mutex。的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!


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

相关文章

Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题

《Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题》:本文主要介绍Ubuntu上手动安装Go环境并解决“可执行文件格式错误”问题,具有很好的参考价值,希望对大家有所帮助,如有错误或未... 目录一、前言二、系统架构检测三、卸载旧版 Go四、下载并安装正确版本五、配置环境变量六、验证安装七、常见

使用Nginx配置文件服务器方式

《使用Nginx配置文件服务器方式》:本文主要介绍使用Nginx配置文件服务器方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1. 为什么选择 Nginx 作为文件服务器?2. 环境准备3. 配置 Nginx 文件服务器4. 将文件放入服务器目录5. 启动 N

使用nohup和--remove-source-files在后台运行rsync并记录日志方式

《使用nohup和--remove-source-files在后台运行rsync并记录日志方式》:本文主要介绍使用nohup和--remove-source-files在后台运行rsync并记录日... 目录一、什么是 --remove-source-files?二、示例命令三、命令详解1. nohup2.

Qt之QMessageBox的具体使用

《Qt之QMessageBox的具体使用》本文介绍Qt中QMessageBox类的使用,用于弹出提示、警告、错误等模态对话框,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.简单介绍3.常见函数4.按钮类型(QMessage::StandardButton)5.分步骤实现弹窗6.总结1.引言

Python使用Reflex构建现代Web应用的完全指南

《Python使用Reflex构建现代Web应用的完全指南》这篇文章为大家深入介绍了Reflex框架的设计理念,技术特性,项目结构,核心API,实际开发流程以及与其他框架的对比和部署建议,感兴趣的小伙... 目录什么是 ReFlex?为什么选择 Reflex?安装与环境配置构建你的第一个应用核心概念解析组件

Qt中Qfile类的使用

《Qt中Qfile类的使用》很多应用程序都具备操作文件的能力,包括对文件进行写入和读取,创建和删除文件,本文主要介绍了Qt中Qfile类的使用,具有一定的参考价值,感兴趣的可以了解一下... 目录1.引言2.QFile文件操作3.演示示例3.1实验一3.2实验二【演示 QFile 读写二进制文件的过程】4.

spring security 超详细使用教程及如何接入springboot、前后端分离

《springsecurity超详细使用教程及如何接入springboot、前后端分离》SpringSecurity是一个强大且可扩展的框架,用于保护Java应用程序,尤其是基于Spring的应用... 目录1、准备工作1.1 引入依赖1.2 用户认证的配置1.3 基本的配置1.4 常用配置2、加密1. 密

WinForms中主要控件的详细使用教程

《WinForms中主要控件的详细使用教程》WinForms(WindowsForms)是Microsoft提供的用于构建Windows桌面应用程序的框架,它提供了丰富的控件集合,可以满足各种UI设计... 目录一、基础控件1. Button (按钮)2. Label (标签)3. TextBox (文本框

Python多进程、多线程、协程典型示例解析(最新推荐)

《Python多进程、多线程、协程典型示例解析(最新推荐)》:本文主要介绍Python多进程、多线程、协程典型示例解析(最新推荐),本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定... 目录一、multiprocessing(多进程)1. 模块简介2. 案例详解:并行计算平方和3. 实现逻

解决Java异常报错:java.nio.channels.UnresolvedAddressException问题

《解决Java异常报错:java.nio.channels.UnresolvedAddressException问题》:本文主要介绍解决Java异常报错:java.nio.channels.Unr... 目录异常含义可能出现的场景1. 错误的 IP 地址格式2. DNS 解析失败3. 未初始化的地址对象解决