当前位置: 首页 > news >正文

C++的并发世界(七)——互斥锁

0.死锁的由来

假设有两个线程T1和T2,它们需要对两个互斥量mtx1和mtx2进行访问。而且需要按照以下顺序获取互斥量的所有权:
-T1先获取mte1的所有权,再获取mt2的所有权。
-T2先获取 mtx2的所有权。再铁取 mtx1的所有权。
如果两个线程同时执行,就会出现死锁问题。因为T1获取了mtx1的所有权,但是无法获取mtx2的所有权,而T2获取了mtx2的所有权,但是无法获取 mtx1的所有权,两个线程互相等待对方释放互斥量,导致死锁。

1.不同锁类型

类型类名作用
超时锁timed_mutex避免长时间死锁
递归锁recursive_mutex同一线程的同一锁可以锁多次避免死锁
共享锁shared_mutex可以充分利用cpu资源

2.各种锁

2.1超时锁

①作用:避免长时间死锁
②性质:可以记录锁获取情况,多次超时,可以记录日志,获取错误情况。

#include <iostream>
#include <thread>
#include <mutex>std::timed_mutex tmux;void ThreadMainTime(int i)
{for (;;){if (tmux.try_lock_for(std::chrono::microseconds(500))){std::cout << i << ":[try_lock_for timeout]" << std::endl;continue;}std::cout << "[in]"<< i << std::endl;tmux.unlock();std::this_thread::sleep_for(std::chrono::microseconds(1));}
}int main()
{for (int i = 0; i < 3; i++){std::thread th(ThreadMainTime, i + 1);th.detach();}getchar();return 0;
}

2.2递归锁

①作用:同一线程的同一锁可以锁多次,避免不必要的死锁。
②性质:组合业务用到同一个锁

注:recursive_timed_mutex为递归超时锁!

#include <iostream>
#include <thread>
#include <mutex>std::recursive_mutex rmux;void Task1()
{rmux.lock();std::cout << "task1 [in] " << std::endl;rmux.unlock();
}void Task2()
{rmux.lock();std::cout << "task2 [in] " << std::endl;rmux.unlock();
}void ThreadMainRec(int i)
{for (;;){rmux.lock();Task1();std::cout << i << "[in]" << std::endl;std::this_thread::sleep_for(std::chrono::microseconds(2000));Task2();rmux.unlock();}
}int main()
{for (int i = 0; i < 3; i++){std::thread th(ThreadMainRec, i + 1);th.detach();}getchar();return 0;
}

2.3共享锁

在这里插入图片描述

#include <iostream>
#include <thread>
#include <mutex>
#include <shared_mutex>std::shared_timed_mutex stmux;void ThreadRead(int i)
{for (;;){stmux.lock_shared();std::cout << "Read:" << i << std::endl;std::this_thread::sleep_for(std::chrono::microseconds(3000));stmux.unlock_shared();std::this_thread::sleep_for(std::chrono::microseconds(1));}
}void ThreadWrite(int i)
{for (;;){stmux.lock_shared();stmux.unlock_shared();stmux.lock();std::cout << "Write:" << i << std::endl;std::this_thread::sleep_for(std::chrono::microseconds(3000));stmux.unlock();std::this_thread::sleep_for(std::chrono::microseconds(1));}
}int main()
{for (int i = 0; i < 3; i++){std::thread th(ThreadWrite, i + 1);th.detach();}for (int i = 0; i < 3; i++){std::thread th(ThreadRead, i + 1);th.detach();}getchar();return 0;
}

相关文章:

C++的并发世界(七)——互斥锁

0.死锁的由来 假设有两个线程T1和T2&#xff0c;它们需要对两个互斥量mtx1和mtx2进行访问。而且需要按照以下顺序获取互斥量的所有权&#xff1a; -T1先获取mte1的所有权,再获取mt2的所有权。 -T2先获取 mtx2的所有权。再铁取 mtx1的所有权。 如果两个线程同时执行&#xff0c…...

NI-LabView的DAQ缺少或丢失的解决办法(亲测有效)

DAQmx在Labview中不显示或缺失 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件解决办法 问题&#xff1a;在NI Packasge Manager安装完DAQ后在labview中不显示控件 在打开测量I/O时&#xff0c;见不到 DAQmx&#xff0c;或者在Express中见不到DAQ助手…...

cesium 调整3dtiles的位置 世界坐标下 相对坐标下 平移矩阵

cesium调整3dtiles的位置用到的是平移矩阵&#xff0c;原理是在世界坐标系中用偏移点减去原始点得到一个平移向量&#xff0c;再根据这个向量得到平移矩阵。 原始点&#xff1a;一般是模型的中心点位置&#xff0c;可通过模型的包围盒得到偏移点&#xff1a;可分为两种情况&…...

flutter跑通腾讯云直播Demo

运行示例 前提条件 要求java jdk 11版本 并且配置到了环境变量 重要 要求flutter 版本 2.8.0 并且配置到了环境变量 重要 要求dart-sdk版本2.15 并且配置到了环境变量 重要 您已 注册腾讯云 账号&#xff0c;并完成 实名认证。 申请 SDKAPPID 和 SECRETKEY 登录实时音视频控…...

飞机降落蓝桥杯[2023蓝桥省赛B组]

2023蓝桥省赛B组 B题 飞机降落 题解 标准深搜板子题&#xff0c;难度不大 #include<bits/stdc.h> using namespace std; #define MAX 10 struct node{int t,d,l;//t:飞机到达时间 d:飞机最大盘旋时间 l:飞机降落所需时间bool v;//标记此架飞机是否被搜索过 用于剪枝 };…...

如何动态渲染HTML内容?用v-html!

&#x1f90d; 前端开发工程师、技术日更博主、已过CET6 &#x1f368; 阿珊和她的猫_CSDN博客专家、23年度博客之星前端领域TOP1 &#x1f560; 牛客高级专题作者、打造专栏《前端面试必备》 、《2024面试高频手撕题》 &#x1f35a; 蓝桥云课签约作者、上架课程《Vue.js 和 E…...

EFcore 6 连接oracle19 WinForm vs2022

用EFcore访问Oracle&#xff0c;终于不需要Oracle的什么安装包了&#xff0c;直接在VS2022中就可以轻松搞定。在csdn上看到一哥们的帖子&#xff0c;测试了一下&#xff0c;发现很方便。使用的场景是&#xff1a;VS2022中EFcore6。经过测试&#xff0c;同 Navicat Premium 16比…...

(delphi11最新学习资料) Object Pascal 学习笔记---第9章第2节(finally代码块)

9.2 finally 代码块 ​ 还有第四个用于异常处理的关键字&#xff0c;我已经提到过&#xff0c;但到目前为止还没有使用过&#xff0c;那就是 finally。finally块用于执行一些应始终执行的操作&#xff08;通常是清理操作&#xff09;。事实上&#xff0c;无论是否发生异常&…...

220 基于matlab的考虑直齿轮热弹耦合的动力学分析

基于matlab的考虑直齿轮热弹耦合的动力学分析&#xff0c;输入主动轮、从动轮各类参数&#xff0c;考虑润滑油温度、润滑油粘度系数等参数&#xff0c;输出接触压力、接触点速度、摩擦系数、对流传热系数等结果。程序已调通&#xff0c;可直接运行。 220直齿轮热弹耦合 接触压力…...

Intrigue Core:一款功能强大的攻击面枚举引擎

关于Intrigue Core Intrigue Core是一款功能强大的开源攻击面枚举引擎&#xff0c;该工具可以帮助广大研究人员更好地管理应用程序的攻击面。 Intrigue Core集成了各种各样的安全数据源&#xff0c;可以将这些数据提取到标准化的对象模型中&#xff0c;并通过图形数据库跟踪关…...

【精品PPT】智慧路灯大数据平台整体建设实施方案(免费下载)

1、知识星球下载&#xff1a; 如需下载完整PPTX可编辑源文件&#xff0c;请前往星球获取&#xff1a;https://t.zsxq.com/19QeHVt8y 2、免费领取步骤&#xff1a; 【1】关注公众号 方案驿站 【2】私信发送 【智慧路灯大数据平台】 【3】获取本方案PDF下载链接&#xff0c;直…...

idea 中运行spring boot 项目报 Command line is too long的解决办法。

Command line is too long 在这里选择edit configures 选择shrten command line , 选择 jar manifest 运行即可。...

Windows终端添加git bash

环境&#xff1a;windows11 终端&#xff1a;windows terminal git bash默认的界面不太好看&#xff0c;添加到终端会比较好用 步骤 打开 windows terminal&#xff0c;在向下箭头 点击 设置左侧栏 点击 “添加新配置文件”&#xff0c;如下图配置&#xff0c;主要修改项&…...

【方法】PDF密码如何取消?

对于重要的PDF文件&#xff0c;很多人会设置密码保护&#xff0c;那后续不需要保护了&#xff0c;如何取消密码呢&#xff1f; 今天我们来看看&#xff0c;PDF的两种密码&#xff0c;即“限制密码”和“打开密码”&#xff0c;是如何取消的&#xff0c;以及忘记密码的情况要怎…...

怎么开发一个预约小程序_一键预约新体验

预约小程序&#xff0c;让生活更便捷——轻松掌握未来&#xff0c;一键预约新体验 在快节奏的现代生活中&#xff0c;我们总是在不断地奔波&#xff0c;为了工作、为了生活&#xff0c;不停地忙碌着。然而&#xff0c;在这繁忙的生活中&#xff0c;我们是否曾想过如何更加高效…...

JavaScript_注释数据类型

JavaScript_语法_注释&数据类型&#xff1a; 1.2注释&#xff1a; 1.单行注释&#xff1a;//注释内容 2.多行注释&#xff1a;/*注释内容*/ 1.3数据类型&#xff1a; 1.原始数据类型(基本数据类型)&#xff1a;&#xff08;只有这五种&#xff09; 1.number&#xff1a;数字…...

蓝桥杯2020年第十一届省赛 CC++ 研究生组2.0

约数个数 #include<iostream> #include<cmath> using namespace std; int main(){int n 78120, ans 0, sqr sqrt(n);for(int i 1; i < sqr; i){if(n % i 0){ans;//printf("%d,", i);if(i * i ! n) {ans;//printf("%d,", n / i);}}}//…...

SOCKS5代理、代理IP、跨界电商、游戏技术与网络安全的综合探讨

在全球经济一体化的大背景下&#xff0c;"出海"已成为许多企业尤其是电商和游戏行业的重要战略方向。然而&#xff0c;随着企业业务的扩展到海外市场&#xff0c;网络安全、数据隐私和内容访问等问题也随之而来。本文将深入探讨SOCKS5代理、代理IP在跨界电商和游戏行…...

关于HTTP1.0、1.1、1.x、2.0、3.0与HTTPS之间的理解

关于HTTP1.0、1.1、1.x、2.0、3.0与HTTPS之间的理解 HTTP的由来 HTTP是Hyper Text Transfer Protocol&#xff08;超文本传输协议&#xff09;的缩写。它的发展是万维网协会&#xff08;World Wide Web Consortium&#xff09;和Internet工作小组IETF&#xff08;Internet Eng…...

useRef总结

一、使用ref引用值 在react中ref的主要用途是用来获取DOM元素或者某个组件实例的引用。当你想访问真实的DOM节点&#xff0c;或者需要在组件之间共享可变数据且不需要触发重新渲染时&#xff0c;通常会使用ref。在vue中ref是响应式的&#xff0c;当数据发生改变时&#xff0c;相…...

React 第五十五节 Router 中 useAsyncError的使用详解

前言 useAsyncError 是 React Router v6.4 引入的一个钩子&#xff0c;用于处理异步操作&#xff08;如数据加载&#xff09;中的错误。下面我将详细解释其用途并提供代码示例。 一、useAsyncError 用途 处理异步错误&#xff1a;捕获在 loader 或 action 中发生的异步错误替…...

MySQL 隔离级别:脏读、幻读及不可重复读的原理与示例

一、MySQL 隔离级别 MySQL 提供了四种隔离级别,用于控制事务之间的并发访问以及数据的可见性,不同隔离级别对脏读、幻读、不可重复读这几种并发数据问题有着不同的处理方式,具体如下: 隔离级别脏读不可重复读幻读性能特点及锁机制读未提交(READ UNCOMMITTED)允许出现允许…...

《从零掌握MIPI CSI-2: 协议精解与FPGA摄像头开发实战》-- CSI-2 协议详细解析 (一)

CSI-2 协议详细解析 (一&#xff09; 1. CSI-2层定义&#xff08;CSI-2 Layer Definitions&#xff09; 分层结构 &#xff1a;CSI-2协议分为6层&#xff1a; 物理层&#xff08;PHY Layer&#xff09; &#xff1a; 定义电气特性、时钟机制和传输介质&#xff08;导线&#…...

c++ 面试题(1)-----深度优先搜索(DFS)实现

操作系统&#xff1a;ubuntu22.04 IDE:Visual Studio Code 编程语言&#xff1a;C11 题目描述 地上有一个 m 行 n 列的方格&#xff0c;从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子&#xff0c;但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...

基于数字孪生的水厂可视化平台建设:架构与实践

分享大纲&#xff1a; 1、数字孪生水厂可视化平台建设背景 2、数字孪生水厂可视化平台建设架构 3、数字孪生水厂可视化平台建设成效 近几年&#xff0c;数字孪生水厂的建设开展的如火如荼。作为提升水厂管理效率、优化资源的调度手段&#xff0c;基于数字孪生的水厂可视化平台的…...

【AI学习】三、AI算法中的向量

在人工智能&#xff08;AI&#xff09;算法中&#xff0c;向量&#xff08;Vector&#xff09;是一种将现实世界中的数据&#xff08;如图像、文本、音频等&#xff09;转化为计算机可处理的数值型特征表示的工具。它是连接人类认知&#xff08;如语义、视觉特征&#xff09;与…...

工业自动化时代的精准装配革新:迁移科技3D视觉系统如何重塑机器人定位装配

AI3D视觉的工业赋能者 迁移科技成立于2017年&#xff0c;作为行业领先的3D工业相机及视觉系统供应商&#xff0c;累计完成数亿元融资。其核心技术覆盖硬件设计、算法优化及软件集成&#xff0c;通过稳定、易用、高回报的AI3D视觉系统&#xff0c;为汽车、新能源、金属制造等行…...

【JavaWeb】Docker项目部署

引言 之前学习了Linux操作系统的常见命令&#xff0c;在Linux上安装软件&#xff0c;以及如何在Linux上部署一个单体项目&#xff0c;大多数同学都会有相同的感受&#xff0c;那就是麻烦。 核心体现在三点&#xff1a; 命令太多了&#xff0c;记不住 软件安装包名字复杂&…...

Redis数据倾斜问题解决

Redis 数据倾斜问题解析与解决方案 什么是 Redis 数据倾斜 Redis 数据倾斜指的是在 Redis 集群中&#xff0c;部分节点存储的数据量或访问量远高于其他节点&#xff0c;导致这些节点负载过高&#xff0c;影响整体性能。 数据倾斜的主要表现 部分节点内存使用率远高于其他节…...

AI,如何重构理解、匹配与决策?

AI 时代&#xff0c;我们如何理解消费&#xff1f; 作者&#xff5c;王彬 封面&#xff5c;Unplash 人们通过信息理解世界。 曾几何时&#xff0c;PC 与移动互联网重塑了人们的购物路径&#xff1a;信息变得唾手可得&#xff0c;商品决策变得高度依赖内容。 但 AI 时代的来…...