如何避免死锁:方法一

news2024/9/22 5:32:05

        需要先看前文:死锁的产生_御坂美琴1的博客-CSDN博客

        对两个资源使用一把锁。即小朋友玩敲鼓的时候会同时拿走鼓和鼓槌。

        如图:

         可以看到“线程1执行了,但是线程2没有执行,还在被阻塞着。为什么线程1运行完毕,线程2还没有开始运行?

        因为此时使用了lock函数,lock是需要自己手动开锁的。

        增加如下语句即可:

 

        图片中的代码不严谨,因为它考虑的是线程1先进行,修改后如下:

全部代码如下:

#include<iostream>
#include<thread>
#include<mutex>
#include<windows.h>

using namespace std;

void thread1();
void thread2();

mutex mx1;
mutex mx2;
int a = 100;
int b = 200;
int main(void)
{
	thread t1(thread1);
	thread t2(thread2);
	t1.join();
	t2.join();
	return 0;
}

void thread1()
{
	cout << "thread1 is running" << endl;
	lock(mx1,mx2);//对mx1和mx2同时加锁
	lock_guard<mutex> guard1(mx1, adopt_lock);//adopt_lock自适应上锁,如果上过锁了就不会重复上锁
	lock_guard<mutex> guard2(mx2, adopt_lock);
	cout << "thread1's num is " << a << endl;
	Sleep(1000);
	cout << "get b" << " b = " << b << endl;
	cout << "1 : a + b = " << a + b << endl;

}

void thread2()
{
	cout << "thread2 is running" << endl;
	lock(mx1, mx2);
	lock_guard<mutex> guard1(mx1, adopt_lock);//adopt_lock自适应上锁,如果上过锁了就不会重复上锁
	lock_guard<mutex> guard2(mx2, adopt_lock);
	cout << "thread2's num is " << b << endl;
	Sleep(1000);
	cout << "get a" << " a = " << a << endl;
	cout << "2 : b - a = " << b - a << endl;
}

 

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

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

相关文章

解决sourcetree中推送不显示分支 - 软件篇

问题&#xff1a; 如上图所示&#xff0c;在我们使用sourcetree推送我们的代码时 推送的弹窗里不回显示我们的分支&#xff1b; 众所周知&#xff1a;在我们没有新创建分支的情况下&#xff0c;他会默认有一个master分支&#xff0c;这也是我们的主分支 在网上搜这个问题&…

61 KVM Skylark虚拟机混部-使用及最佳实践

文章目录 61 KVM Skylark虚拟机混部-使用及最佳实践61.1 使用Skylark61.1.1 启动服务61.1.2 创建虚拟机61.1.3 虚拟机运行 61.2 最佳实践61.2.1 虚拟机业务推荐61.2.2 虚拟机绑核配置 61 KVM Skylark虚拟机混部-使用及最佳实践 61.1 使用Skylark 61.1.1 启动服务 初次启动&a…

Spring MVC的工作原理

1.Spring MVC的工作原理 1.浏览器发送请求&#xff0c;DispatcherServlet拦截请求 2.DispatcherServlet将需要先调用HandlerMapping通过uri找到能够处理请求的Handler&#xff0c;然后将请求涉及到的Handler封装 3.DispatcherServlet调用HandlerAdapter适配执行Handler 4.H…

LeetCode 打卡day45-- 单词拆分和多重背包问题

一个人的朝圣 — LeetCode打卡第45天 知识总结 Leetcode 139. 单词拆分题目说明代码说明 知识总结 今天写了一道题目, 但是还挺难的, 而且是面试高频题目 还过了一遍多重背包问题. 多重背包与01背包的区别在于多重背包限制了物品的个数, 某些物品的个数可能不为1, 可以使用两…

Java缓存简介

一、缓存 1、什么是缓存&#xff1f; 缓存是硬件&#xff0c;是CPU中的组件&#xff0c;CPU存取数据的速度非常的快&#xff0c;一秒钟能够存取、处理十亿条指令和数据&#xff08;术语&#xff1a;CPU主频1G&#xff09;&#xff0c;而内存就慢很多&#xff0c;快的内存能够达…

数据库实验-图书销售管理系统数据库安全管理

一、实验二&#xff1a;图书销售管理系统数据库安全管理 三、实验目的 了解该DBMS系统对数据库管理的内容与方法&#xff0c;特别是理解数据库安全机制和作用&#xff0c;以及PostgreSQL数据库角色管理、用户管理、权限管理的基本方法&#xff0c;培养数据库管理能力。在图书…

CV什么时候能迎来ChatGPT时刻?

卷友们好&#xff0c;我是rumor。 最近看了几篇CV的工作&#xff0c;肉眼就感受到了CVer们对于大一统模型的“焦虑”。 这份焦虑让他们开始尝试统一一切&#xff0c;比如&#xff1a; 统一复杂的自动驾驶任务的优化目标[1]&#xff0c;来自今年CVPR最佳论文。统一典型的CV任务&…

3s定时循环启动弹窗,子窗体3s后自动关闭功能实现

只贴关键代码&#xff1a; 1、父窗体关键代码 private void doAt1AM(object state){//要执行的任务&#xff0c;直接button调用即可//执行功能...的任务spring_Form spr_Form new spring_Form();spr_Form.Txt "陈先生" ";到1号窗口取药";spr_Form.Show…

WPF中的Behavior及Behavior在MVVM模式下的应用

WPF中的Behavior及Behavior在MVVM模式下的应用 在WPF中&#xff0c;Behaviors&#xff08;行为&#xff09;是一种可重用的组件&#xff0c;可以附加到任何UI元素上&#xff0c;以添加特定的交互行为或功能。Behaviors可以通过附加属性或附加行为的方式来实现。 Behavior并不…

【3Ds Max】使用捕捉工具、轴约束工具实现点的精准对齐

目录 问题 解决步骤 一、在XYZ轴上都对齐 二、只在一或两个轴上对齐 问题 举个例子&#xff0c;比如我想让如下的两个立方体的顶点对齐&#xff08;在同一位置&#xff08;XYZ轴都对齐&#xff09;&#xff0c;或仅在一个或两个轴上对齐&#xff09;&#xff1a; 主要使…

【PostgreSQL 数据库技术峰会(成都站)】云原生虚拟数仓 PieCloudDB Database 的架构和关键模块实现...

2023年6月17日&#xff0c;中国开源软件推进联盟 PostgreSQL 分会在成都举办了数据库技术峰会。此次峰会以“新机遇、新态势、新发展”为主题&#xff0c;结合当下信创热潮、人工智能等产业变革背景&#xff0c;探讨 PostgreSQL 数据库在这些新机遇下的发展前景。峰会邀请众多行…

PHP 设备管理系统 mysql数据库web结构apache计算机软件工程网页wamp

一、源码特点 PHP 设备管理系统 是一套完善的WEB设计系统&#xff0c;对理解php编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。 视频演示 PHP 设备管理系统 mysql数据库web结构apache 代码下载 https://download.csd…

70、基于51单片机智能手环心率计步温湿度蓝牙APP监控系统设计(程序+原理图+参考论文+开题报告+元器件清单等)

摘 要 计步器是一种颇受欢迎的日常锻炼进度监控器&#xff0c;可以激励人们挑战自己&#xff0c;增强体质&#xff0c;帮助瘦身。早期设计利用加重的机械开关检测步伐&#xff0c;并带有一个简单的计数器。晃动这些装置时&#xff0c;可以听到有一个金属球来回滑动&#xff0c…

Ansible快速上手

使用Ansible-快速上手 ping模块简介&#xff1a; 该模块不使用ICMP ping&#xff0c;而是使用基于python的模块完成。 语法&#xff1a; ansible 主机IP/或在清单中的名称 -m(表示选择模块) ping &#xff08;表示使用ping模块&#xff09;清单文件&#xff1a; [dev] 192.…

【运维工程师学习】安装VMware并创建Centos8虚拟机(保姆级教程)

安装虚拟机&#xff08;VMware&#xff09;保姆级教程&#xff08;附安装包&#xff09; 下载链接安装步骤创建Centos8虚拟机 下载链接 百度网盘链接&#xff1a;https://pan.baidu.com/s/1pWSsCnP_2Yfe7dRCPQitCg 提取码&#xff1a;6666 Centos8下载&#xff1a;https://nex…

0基础学习VR全景平台篇,第51篇:高级功能-自定义菜单

大家好&#xff0c;欢迎观看蛙色VR官方系列——后台使用课程&#xff01; 本期为大家带来蛙色VR平台&#xff0c;高级功能-自定义菜单&#xff01; 功能位置示意 一、本功能将用在哪里&#xff1f; 自定义菜单&#xff0c;是显示在VR漫游作品底部和顶部各种可点击的图标按钮。…

Liunx 安装 Nginx

1.准备Nginx所需依赖 yum install gcc-cyum install -y zlib zlib-develyum install -y pcre pcre-develyum install -y openssl openssl-devel2.下载tar并解压 wget http://nginx.org/download/nginx-1.23.0.tar.gz tar -xvf nginx-1.23.0.tar.gz 3.安装Nginx cd nginx-1.2…

mmdetection1.4训练fasterrcnn

mmdetection1.4训练fasterrcnn 指定参数文件urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1131)>No such file or directory: data/coco/annotations/instances…

【C/C++实现进程间通信 一】共享内存方式

前情回顾&#xff1a; 上一期已经讲解过了进程的相关概念以及进程间通信的实现原理&#xff0c;下面仅展示相关代码。 思路&#xff1a; /* 本项目主要用于对同主机上以共享内存方式进行进程间通信的测试 。 1.包含一个外部程序 publisherDemo.exe 以及 subscriberDemo.exe。…

Selenium 使用已开启的浏览器执行测试

实际测试工作中可能遇到某些需要使用手动开启浏览器执行测试的情况&#xff0c;比如某些网站登录需要手机短信验证&#xff0c;为了跳过这步&#xff0c;可以手动登录网站&#xff0c;在已登录的页面继续测试 1、找到本地安装的浏览器启动路径&#xff0c;例如Chrome C:\Progra…