多线程:死锁

目录

死锁的条件

死锁的示例

死锁的预防与解决

死锁的检测

总结


死锁(Deadlock)是多线程或多进程环境中一种特定的状态,指的是两个或多个线程或进程在执行过程中,由于争夺资源而造成的一种相互等待的状态,导致它们无法继续执行下去。当出现死锁时,相关的线程或进程都处于阻塞状态,无法获得所需的资源。

有这么一个段子:这天你去面试,HR问你什么是死锁。这时你和HR说:你给我发offer,我就告诉你什么是死锁。那HR又说:你告诉我什么是死锁,我就给你发offer。于是就这么周而复始,HR和你都在等待对方松口,于是就形成了一个循环,这就是死锁状态。

段子中的死锁分析:

  1. 互斥条件:你和HR各自持有对方所需的东西(你的知识和HR的offer),双方都不能同时拥有。

  2. 保持并等待条件:你在等待HR发offer,而HR则在等待你讲解什么是死锁。两者都在持有自己所拥有的“资源”同时等待对方。

  3. 不剥夺条件:你已经持有的(对死锁的了解)无法被强制夺取,而HR的offer也无法被你强行获取。

  4. 循环等待条件:你和HR形成了一个循环:你等待HR,HR等待你,所以形成了一个死锁状态。


死锁的条件

为了了解死锁的本质,需要认识到死锁发生的必要条件,这通常被称为死锁的四个必要条件

  1. 互斥条件:至少有一个资源必须被一个线程占用,而此时此资源不能被其他线程占用。

  2. 保持并等待条件:一个线程至少持有一个资源,同时又在等待获取其他线程持有的资源。

  3. 不剥夺条件:已经分配给线程的资源,在未使用完之前,不能被其他线程强行夺取。

  4. 循环等待条件:存在一个线程的集合,线程 A 等待线程 B 持有的资源,线程 B 等待线程 C 持有的资源,线程 C 又等待线程 A 持有的资源。这构成了一个环路。


死锁的示例

考虑以下示例,说明死锁的发生:

#include <iostream>
#include <thread>
#include <mutex>// 定义两个互斥锁
std::mutex mutexA;
std::mutex mutexB;// 线程1
void thread1Func() {std::lock_guard<std::mutex> lockA(mutexA);std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟一些工作std::lock_guard<std::mutex> lockB(mutexB); // 可能会死锁std::cout << "Thread 1 acquired both locks" << std::endl;
}// 线程2
void thread2Func() {std::lock_guard<std::mutex> lockB(mutexB);std::this_thread::sleep_for(std::chrono::milliseconds(100)); // 模拟一些工作std::lock_guard<std::mutex> lockA(mutexA); // 可能会死锁std::cout << "Thread 2 acquired both locks" << std::endl;
}int main() {std::thread thread1(thread1Func);std::thread thread2(thread2Func);thread1.join();thread2.join();return 0;
}

在这个代码示例中,thread1Func 和 thread2Func 两个线程可能会在获取锁的过程中造成死锁。假设:

  • 线程1 先获取了 mutexA,然后尝试去获取 mutexB
  • 线程2 先获取了 mutexB,然后尝试去获取 mutexA

如果两个线程在此时同时获取了各自的锁,就会造成互相等待,形成死锁。


死锁的预防与解决

为了避免死锁,可以采取以下几种策略:

  1. 资源有序分配:通过按顺序请求资源,确保不会形成环路。例如,总是先请求 mutexA 再请求 mutexB

  2. 资源抢占:如果一个线程被阻塞,它所持有的资源可以被强制释放,允许其他线程获取资源。

  3. 超时机制:给资源请求设置一个超时时间,超过时间的话,放弃所占用的资源,稍后再尝试获取。

  4. 死锁检测和恢复:运行时监控系统状态,以发现和处理死锁。如果检测到死锁,可以通过终止某些线程或强制释放资源来恢复系统。


死锁的检测

在一些高级系统中,可以使用算法来检测死锁,如银行家算法、等待图和资源分配图等,以便找出死锁发生的根本原因并采取措施解决它。

总结

死锁是多线程编程中一个需要谨慎处理的问题,了解其发生的条件和预防策略能够帮助我们编写更为健壮和高效的代码。通过合理的资源管理和调度,可以有效减小甚至避免死锁的发生。

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

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

相关文章

Linux usb主机控制器HC阅读

intel的UHCI 一种usb主机控制器的接口规范,遵守它的硬件称为UHCI主机控制器,Linux中,把这种硬件叫做HC,host controller,与之对应的软件,叫做HCD,hc driver, depends on usb & pci: 它的内核软件模块代码是uhci-hcd.c uhci_hcd_init初始化开始: usb_disable函数:…

【openwrt】 libubox组件——ustream

文章目录 ustream 核心数据结构struct ustreamstruct ustream_buf_liststruct ustream_bufstruct ustream_fd ustream 核心APIustream_fd_initustream_uloop_cbustream_fd_read_pendingustream_fill_read ustream_write_pendingustream_writeustream_fd_write ustream 应用示例…

前端开发必须了解的css知识

文本过长省略显示 单行 .ellipsis {overflow: hidden;text-overflow: ellipsis;white-space: nowrap; }多行 方法一&#xff1a; .ellipsis {overflow: hidden;text-overflow: ellipsis;-webkit-line-clamp: 3;word-break: break-all; }方法二&#xff1a; .ellipsis {ove…

文献笔记 - Neural Lander: Stable Drone Landing ControlUsing Learned Dynamics

这篇博文是自己看文章顺手做的笔记 只是简单翻译和整理 仅做个人参考学习和分享 如果作者看到觉得内容不妥请联系我 我会及时处理 本人非文章作者&#xff0c;文献的引用格式如下&#xff0c;原文更有价值 [1]Guanya Shi∗,Xichen Shi∗,Michael OConnell∗,et al.Neural La…

LOGO设计新革命:5款AI工具让你秒变设计大师(必藏)

大家好&#xff0c;我是Shelly&#xff0c;一个专注于输出AI工具和科技前沿内容的AI应用教练&#xff0c;体验过300款以上的AI应用工具。关注科技及大模型领域对社会的影响10年。关注我一起驾驭AI工具&#xff0c;拥抱AI时代的到来。 你是否曾因设计一个既独特又专业的LOGO而感…

Tableau|二 如何利用功能区创建视图

一 认识 Tableau 数据 1.数据角色 维度和度量是Tableau的一种数据角色划分&#xff0c;离散和连续是另一种划分方式。 1.维度和度量 维度往往是一些分类、时间方面的定性字段&#xff0c;将其拖放到功能区时&#xff0c;Tableau不会对其进行计算&#xff0c;而是对视图区进行分…

Swin Transformer(ICCV 2021 best paper):基于卷积层级式架构的移动窗口视觉Transformer!

有关ViT的学习笔记详见&#xff1a;学习笔记——ViT(Vision Transformer)-CSDN博客 ViT在图像分类方面的结果令人鼓舞&#xff0c;但由于其低分辨率的特征映射和复杂度随图像大小的二次方增长&#xff0c;其架构不适合作为密集视觉任务或高分辨率输入图像的backbone。根据经验&…

JetBrains系列产品无限重置免费试用方法

JetBrains系列产品无限重置免费试用方法 写在前面安装插件市场安装插件 写在前面 支持的产品&#xff1a; IntelliJ IDEA AppCode CLion DataGrip GoLand PhpStorm PyCharm Rider RubyMine WebStorm为了保证无限重置免费试用方法的稳定性&#xff0c;推荐下载安装2021.2.2及其…

OpenAI GPT-3 API error: “This model‘s maximum context length is 2049 tokens“

题意&#xff1a;OpenAI GPT-3 API 错误&#xff1a;“此模型的最大上下文长度是 2049 个token” 问题背景&#xff1a; I have two issues relating to the response result from OpenAI completion. 我遇到了两个与OpenAI完成响应结果相关的问题 The following result does…

Sam Altman的博客:The Intelligence Age

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

《深入解析:水果销售数据库操作与查询技巧》

文章目录 一、数据库结构与数据源插入1.1 创建数据库与表1.2 插入数据 二、基础数据查询2.1 查询客户信息2.2 查询供应商信息 三、查询优化与技巧3.1 使用LIMIT子句 四、高级查询技巧4.1 使用聚合函数4.2 连接查询4.3 使用子查询 五、案例分析5.1 客户订单详情查询 一、数据库结…

无法将“allure”项识别为 cmdlet、函数、脚本文件或可运行程序的名称的解决方法-allure的安装配置全过程

新手在使用allure之前&#xff0c;以为只是pip install allure-pytest就可以&#xff0c;no&#xff01;&#xff01;&#xff01; 其实&#xff0c;还需要下载allure&#xff0c;allure的具体步骤如下&#xff1a; 1.下载 allure。 allure的下载地址&#xff1a;Central Re…

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例

828华为云征文 | 使用Linux管理面板1Panel管理华为云Flexus云服务器X实例 一、华为云Flexus云服务器X实例介绍1.1 Flexus云服务器X实例简介1.2 Flexus云服务器X实例特点 二、1Panel介绍2.1 1Panel 简介2.2 1Panel 特点 三、本次实践介绍3.1 本次实践简介3.2 本次环境规划 四、购…

报表做着太费劲?为你介绍四款好用的免费报表工具

1. 山海鲸可视化 介绍&#xff1a; 山海鲸可视化是一款免费的国产可视化报表软件&#xff0c;与许多其他宣传免费的软件不同&#xff0c;山海鲸的报表功能完全免费并且没有任何限制&#xff0c;就连网站管理后台这个功能也是免费的。同时山海鲸可视化还提供了种类丰富的可视化…

「数组」离散化 / Luogu B3694(C++)

目录 概述 思路 算法过程 复杂度 Code 概述 Luogu B3694&#xff1a; 给定一个长度为 n 的数列 aa。定义 rank(i) 表示数列 a 中比 ai 小的不同数字个数再加一。 对 1≤i≤n&#xff0c;现在请你求出所有的 rank(i)。 输出格式 对每组数据&#xff0c;输出一行 n 个整数&a…

BUUCTF [SCTF2019]电单车

使用audacity打开&#xff0c;发现是一段PT2242 信号 PT2242信号 有长有短&#xff0c;短的为0&#xff0c;长的为1化出来 这应该是截获电动车钥匙发射出的锁车信号 0 01110100101010100110 0010 0前四位为同步码0 。。。中间这20位为01110100101010100110为地址码0010为功…

关于预处理的一系列问题

1. 预定义符号 C语⾔设置了⼀些预定义符号&#xff0c;可以直接使⽤&#xff0c;预定义符号也是在预处理期间处理的。 2. #define定义常量 #define name stuff 如果定义的 stuff过⻓&#xff0c;可以分成⼏⾏写&#xff0c;除了最后⼀⾏外&#xff0c;每⾏的后⾯都加⼀个反…

值得入手的宠物空气净化器——希喂、352、IAM三款产品真实测评

在快节奏的现代生活中&#xff0c;养宠成为很多人的精神寄托&#xff0c;回到家中与猫咪玩耍是一天中最放松的时刻。但这美好的生活也存在着一些烦恼——宠物毛发清理与异味。宠物空气净化器作为一种新兴的清理工具&#xff0c;以其高效、全面的特点&#xff0c;受到了越来越多…

PMP--二模--解题--91-100

文章目录 14.敏捷91、 [单选] 在敏捷团队完成三次迭代之后&#xff0c;项目经理确定团队在这三次迭代中的平均速度是30个故事点。还有292个故事点来完成项目的剩余部分。团队需要多少次额外的迭代才能完成项目&#xff1f; 9.资源管理92、 [单选] 项目经理前往另一个国家执行最…

Go基础学习04-变量重声明;类型转换;类型断言;Unicode代码点;类型别名;潜在类型

目录 变量重声明 类型断言 类型转换 类型转换注意事项 Unicode代码点 类型别名、潜在类型 类型别名的意义 变量重声明 编写代码&#xff1a; package mainimport "fmt"var container []string{"Beijing", "Shanghai"}func main() {fmt.Pr…