死锁/死锁的实现

2023-11-07

首先明白死锁产生的原因:
死锁指两个或两个以上线程执行过程中,因争夺资源而造成的互相等待现象。
四个必要条件:
1. 互斥性:线程对资源的占有是排他性的,一个资源只能被一个线程占有,直到释放。
2. 请求和保持条件:一个线程对请求被占有资源发生阻塞时,对已经获得的资源不释放。
3. 不剥夺:一个线程在释放资源之前,其他的线程无法剥夺占用。
4. 循环等待:发生死锁时,线程进入死循环,永久阻塞
C++编写锁的代码
第一种是单线程对一个资源重复申请上锁;

#include <iostream>
#include <thread>
#include <mutex>
#include <unistd.h>
using namespace std;
int data = 1;
mutex mt1,mt2;  //锁
void a2() {
	data = data * data;
	mt1.lock();  //第二次申请对mt1上锁,但是上不上去
	cout<<data<<endl;
	mt1.unlock();
}
void a1() {
	mt1.lock();  //第一次对mt1上锁
	data = data+1;
	a2();
	cout<<data<<endl;
	mt1.unlock();
}
int main() {
	thread t1(a1);
	t1.join();
	cout<<"main here"<<endl;
	return 0;
}

第二种是两个线程对两个资源申请上锁,形成环路。

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

using namespace std;

int data = 1;
mutex mt1,mt2;

void a2() {
	mt2.lock();
	sleep(1);
	data = data * data;
	mt1.lock();  //此时a1已经对mt1上锁,所以要等待
	cout<<data<<endl;
	mt1.unlock();
	mt2.unlock();
}
void a1() {
	mt1.lock();
	sleep(1);
	data = data+1;
	mt2.lock();  //此时a2已经对mt2上锁,所以要等待
	cout<<data<<endl;
	mt2.unlock();
	mt1.unlock();
}

int main() {
	thread t2(a2);
	thread t1(a1);
	
	t1.join();
	t2.join();
	cout<<"main here"<<endl;  //要t1线程、t2线程都执行完毕后才会执行
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

死锁/死锁的实现 的相关文章

  • 语言混合:模型和视图

    考虑开发一个应用程序 其中模型将使用 C 使用 Boost 编写 视图将使用 Objective C 使用 Cocoa Touch 编写 哪里有一些示例展示了如何集成 C 和 Objective C 来开发 iPhone 应用程序 直接从源
  • Dapper 强类型查询返回默认对象值

    刚刚开始使用 Dapper 并喜欢它 我遇到了问题 它返回正确数量的对象 但它们的属性都有默认值 using var dbConnection Connection await dbConnection OpenAsync const st
  • 警告:从指针目标类型中丢弃“const”限定符

    没有const char s意味着 s 是一个指向常量 char 的指针 那么为什么它给我这个警告 我并不是想改变价值观 在第一个函数中警告是return discards const qualifiers from pointer tar
  • 在两个 .cpp 文件之间定义全局变量 [重复]

    这个问题在这里已经有答案了 如何在 A cpp 和 B cpp 之间共享 全球化 bool 变量 其中它们都不包含其他 h 文件 他们有其他联合头文件 但彼此没有 我可以在这些共享标头中定义全局变量吗 Thanks 我可以在这些共享标头中定
  • WPF - 按多列排序时使用自定义比较器

    我有一个 ListView GridView 我想按 2 列排序 因此如果第 1 列中有 2 个以上的项目具有相同的值 它将按第 2 列排序 非常简单 但是在对 A Z 进行排序时 空字符串会出现在顶部 我想把它们移到底部 我制作了一个比较
  • 隐形打开的弹出窗口

    第二天就解决这个问题 要重现 请创建新的 WPF 应用程序 xaml
  • 禁用除滚动之外的 DataGridView

    我如何配置 datagridview 以便用户只能在行中移动并使用滚动 而没有其他 如果我禁用网格不允许我使用滚动 将您的 datagridview 设置为只读 这将禁用任何编辑 dataGridView1 ReadOnly true 在你
  • 将语句插入 SQL Server 数据库

    最近几天我试图找到这个错误 但没有成功 我正在尝试在数据库中插入一个新行 一切都很顺利 没有错误 也没有程序崩溃 My INSERT声明如下 INSERT INTO Polozaj Znesek Uporabnik Cas Kupec Po
  • 当我尝试使用 AVX 功能时,Clang 生成错误

    我使用的是 Windows 10 使用 Clang 版本 5 最近安装 当我编译以下内容时 define AVX define AVX2 include
  • Windows 程序如何临时更改其时区?

    我写了一个函数来返回time t与给定日期的午夜相对应的值 当给定日期没有午夜时 它返回最早可用的时间 例如 当埃及进入夏令时时 这种情况就可能发生 今年 时间更改于 4 月 29 日晚上午夜生效 因此时钟直接从 23 59 转到 01 0
  • 我们应该使用 Eval 还是 Databind 事件?

    当使用 Asp Net 并使用 ListView 等控件创建网站时 使用 Eval 命令是一个好习惯吗 还是应该在 databind 事件中填充文字和数据 取决于您是否想在更新事件上写回数据 在这种情况下数据绑定 如果您只想读取该数据 可以
  • ASP MVC 5 - 403 customError 不起作用

    我正在尝试为我的应用程序创建自定义错误页面 它在大部分情况下都有效 但不适用于403 errors 我的网络配置
  • 使用对象列表构建树

    我有一个带有属性 id 和parent id 的对象列表 我想建造一棵树来连接那些孩子和父母 1 个父对象可以有多个子对象 并且有一个对象将成为所有对象的祖先 实现该功能最快的算法是什么 我使用 C 作为编程语言 但其他语言也可以 像这样的
  • 函数模板重载解析期间的 MSVC 与 Clang/GCC 错误,其中一个函数模板包含参数包

    当我使用参数包时 我注意到这样一种情况 如下所示 在 gcc 和 clang 中编译得很好 但在 msvc 中却不行 template
  • 如何使用eclipse构建C++应用程序

    我已经从以下位置下载了 Eclipse Juno for C here http www eclipse org downloads download php file technology epp downloads release ju
  • 检索 Autofac 容器以解析服务

    在 C WindowForms 应用程序中 我启动一个 OWIN WebApp 它创建另一个类 Erp 的单例实例 public partial class Engine Form const string url http 8080 49
  • printf 参数不足

    我的问题是关于缺少参数的 printf 之后的行为 printf s blah blah d int integer was given as argument and not int written 我已经知道 如果格式参数不足 则行为是
  • C 中的静态和动态绑定(严格来说是 C,而不是 C++)是什么?

    我最初对发布这个问题感到担忧 以免它重复 但即使在谷歌搜索了许多关键字之后 我在 StackOverflow 上找不到任何解释 C 的静态和动态绑定的链接 尽管有 C 的问题和答案 但是都涉及classes以及显然不适合 C 的东西 Sta
  • Visual Studio 2015默认附加库

    当我在 VS 2015 中创建一个空项目时 它会自动将这些库放入 附加依赖项 中 kernel32 lib user32 lib gdi32 lib winspool lib comdlg32 lib advapi32 lib shell3
  • C# 中成员访问中的问号是什么意思?

    有人可以向我解释一下以下代码中会员访问中的问号是什么意思吗 它是标准 C 的一部分吗 尝试在 Xamarin Studio 中编译此文件时出现解析错误 this AnalyzerLoadFailed Invoke this new Anal

随机推荐

  • (面经三,技术面)——时间:2022-11-11 地点:线上

    面试经历 三 时间 2022 11 11 地点 线上 1 什么是抽象类 有抽象方法的类 用来表征对问题领域进行分析 设计中得出的抽象概念 2 抽象类和接口的区别 继承关系 类只能单继承 接口可以实现多个接口 构造函数 抽象类可以有构造函数
  • 王者荣耀学习工具JAVA Robot按键精灵找色点击功能

    一个简单的JAVA按键精灵 import java awt AWTException import java awt Color import java awt MouseInfo import java awt Point import
  • Pandas(一)—— Pandas基础

    Python模块 Pandas Pandas 一 Pandas基础 一 预备知识 1 1 Python基础 1 2 NumPy基础 1 3 练习 1 3 1 利用列表推导式写矩阵乘法 1 3 2 更新矩阵 1 3 3 连续整数的最大长度 二
  • 编程分钟转化小时怎么编_大中小型三菱PLC分类及编程软件学习内容附图文,初学者必看!...

    不少初学PLC的人都会问一个问题 如果学习三菱PLC编程入门应先学习什么 以下是关于PLC类型和运行原理 GX Developer软件的使用说明 如果这篇文章对你有所帮助 记得 收藏 一 PLC的类型 1 小型PLC 一体式结构 I O点数
  • 从Docker到Kubernetes——K8s多租户管理与资源控制

    文章目录 namespace设计解读 什么是namespace 多namespace使用案例 Kubernetes用户认证机制 应用健康检查 namespace设计解读 namespace是k8s进行多租户资源隔离主要手段 那么它在系统中的
  • 关于如何解决mingw64安装后配置完环境变量仍然执行不了gcc命令

    一 背景 已安装对应版本的mingw64 并且已经按照网上教程配置了环境变量 但是仍然无法执行gcc命令 二 遇到的问题 gcc 不是内部或外部命令 也不是可运行的程序 三 如何解决 至于如何打开环境变量 我就不赘述了 想必大家配置环境变量
  • GO语言变量声明的方式

    1 指定变量类型 声明后如果不做赋值 那么使用默认值 1 2 没有进行赋值 但是指明了是什么类型 go会自动加上空值 var a string 2 不指定变量类型 需要进行赋值操作 1 2 可以不指定变量类型 通过变量值 go会自行判断该变
  • Element-ui使用@keyup.enter.native的原因

    keyup enter加 native有什么作用 W3C 标准中有如下规定 即 当一个 form 元素中只有一个输入框时 在该输入框中按下回车应提交该表单 如果希望阻止这一默认行为 可以在 标签上添加 submit native preve
  • linux proc进程,linux 下 /proc/进程号/ 重要进程文件的内容解析

    proc maps 查看进程的虚拟地址空间是如何使用的 该文件有6列 分别为 地址 库在进程里地址范围 权限 虚拟内存的权限 r 读 w 写 x s 共享 p 私有 偏移量 库在进程里地址范围 设备 映像文件的主设备号和次设备号 节点 映像
  • 少儿编程scratch与机器人

    少儿编程scratch与机器人 对于很多的家长们来说 孩子的学习一直都是家长们十分关心和重视的一件事情 很多的家长在培养孩子的学习的时候 会给孩子选择一些能够提升孩子能力的课程 就拿现在很多的家长想要孩子去学习机器人编程的课程来说 他们对于
  • css的标准写法,前端css书写规范

    代码书写规范这种东西虽然不是必须的但是确实很有必要的好的书写规范不单单能增加可阅读性和提高代码性能而且有利于后续人员维护代码 良好的书写规范也是区分新手与专业人员的一个标准 一css书写顺序 1 位置属性position top right
  • VUE项目引入微信jssdk

    我们的一个vue webpack的 SPA项目需要在微信中使用 因此需要导入微信的jssdk库 通过搜索发现npm有微信jssdk的依赖包 weixin js sdk 于是 导入依赖包 npm i S weixin js sdk 前端页面U
  • Log 利用装饰模式 打印增强

    包引用
  • 前端基础--JavaScript

    一 JavaScript介绍 虽然是java作为前缀 但java和javascript的关系 就像老婆和老婆饼之间的关系 没有一毛钱关系 网景公司在Netscape2 0首先推出了JavaScript JavaScript 的正式名称是 E
  • Windows应急响应

    临近冬奥 残奥 发一篇Windows的应急响应 希望对大家有所帮助 下一篇会发Linux的应急响应 目录 Part1 前期交互 Part2 主机排查 Part3 工具篇 Part1 前期交互 这个阶段主要是先找客户了解主机的基本情况 如 主
  • Push failed Remote: Support for password authentication was removed on August 13, 2021.

    啥情况 竟然不能推送代码到github了 还能不能愉快的玩耍了 报错如下 大概意思就是 8月13后 不能使用用户名 密码的形式进行Push 强制大家改成SSH的方式 先说解决方案吧 一 查看是否已有密钥 Mac Users Your Nam
  • 写好“提示”改变“智造未来”-GPT4提示词驶入代码优化驾驶座心得

    开篇 在前端科技的新浪潮中 Artificial Intelligence AI 的逐渐成熟与发展引领着我们向前 其中OpenAI的GPT4提供了我们一种新的可能 帮助我们优化代码 使编程变得更加轻松 在这篇文章中 我们将一同探究如何在1
  • C++ 之 模板与泛型编程(二、模板实例化)

    模板是一个蓝图 它本身不是类或函数 编译器用模板产生指定的类或函数的特定类型版本 产生模板的特定类型实例的过程称为实例化 模板在使用时将进行实例化 类模板在引用实际模板类类型时实例化 函数模板在调用它或用它对函数指针进行初始化或赋值时实例化
  • 【UBUNTU与ROS实战笔记】(二)——系统ROS安装与配置

    本文结构 0 引言 1 ROS系统安装 1 1 解析安装过程 1 2 ROS环境配置 小结 该博文是 UBUNTU与ROS实战笔记 系列的第二篇文章 写这个的过程中我也正一步一步的实际操作 如果你对该内容有兴趣 欢迎留言交流 0 引言 同学
  • 死锁/死锁的实现

    首先明白死锁产生的原因 死锁指两个或两个以上线程执行过程中 因争夺资源而造成的互相等待现象 四个必要条件 1 互斥性 线程对资源的占有是排他性的 一个资源只能被一个线程占有 直到释放 2 请求和保持条件 一个线程对请求被占有资源发生阻塞时