Linux线程:死锁

1. 死锁

(1)概念

死锁(DeadLock)指两个或两个以上的进程或线程执行时,由于竞争临界资源而造成阻塞的现象;若不干涉,则无法推进下去。

(2)死锁的原因

① 竞争临界资源。

② 进程推进顺序不当。

(3)死锁的必要条件

① 互斥访问:竞争临界资源;

② 不可剥夺:未使用完临界资源不释放;

③ 请求和保持:已占部分临界资源,仍请求被其他进程或线程占用的临界资源;

④ 循环等待:各进程或线程等待彼此释放临界资源。

(4)如何处理死锁

① 预防死锁;

        a)破坏请求和保持:协议1. 运行前一次性申请所有所需资源。

                                          协议2. 逐步获取资源,用完立即释放。

        b)破坏不可剥夺:请求不到所有资源,则立即释放所有资源。

        c)破坏循环等待:对资源进行排序,规定执行者必须按递增顺序请求资源。

② 避免死锁;资源动态分配时,用某种方式防止系统进入不安全状态,如银行家算法。

③ 检测死锁;允许死锁,有死锁则解除。


2. 死锁示例

两个线程,两个临界资源。线程1先申请资源1,再申请资源2,然后执行临界区代码;线程2申请资源2,再申请资源1,然后执行临界区代码。则可能出现死锁。

代码示例:

#include<stdlib.h>
#include<pthread.h>
#include<stdio.h>

pthread_mutex_t mutex1;
pthread_mutex_t mutex2;

void* worker1(void* arg) {

    pthread_mutex_lock(&mutex1);
    printf("线程1得到资源1.\n");
    pthread_mutex_lock(&mutex2);
    printf("线程1得到资源2.\n");
    printf("线程1执行临界区代码.\n");
    pthread_mutex_unlock(&mutex1);
    pthread_mutex_unlock(&mutex2);

    return NULL;
}

void* worker2(void* arg) {

    pthread_mutex_lock(&mutex2);
    printf("线程2得到资源2.\n");
    pthread_mutex_lock(&mutex1);
    printf("线程2得到资源1.\n");
    printf("线程2执行临界区代码.\n");
    pthread_mutex_unlock(&mutex1);
    pthread_mutex_unlock(&mutex2);

    return NULL;
}

int main(int argc, const char* argv[]) {

    pthread_t tid1, tid2;
    int ret = -1;

    ret = pthread_mutex_init(&mutex1, NULL);
    ret = pthread_mutex_init(&mutex1, NULL);

    ret = pthread_create(&tid1, NULL, worker1, NULL);
    ret = pthread_create(&tid2, NULL, worker2, NULL);

    ret = pthread_join(tid1, NULL);
    ret = pthread_join(tid2, NULL);

    ret = pthread_mutex_destroy(&mutex1);
    ret = pthread_mutex_destroy(&mutex2);

    return 0;
}

运行结果:

未发生死锁情况:

发生死锁情况:

如何解决上述示例中的死锁问题?

让两个线程申请资源顺序一致。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

06_Uboot顶层Makefile分析_前期所做内容

目录 U-Boot顶层Makefile分析 版本号 MAKEFLAGS变量 命令输出 静默输出 设置编译结果输出目录 代码检查 模块编译 获取主机架构和系统 设置目标架构、交叉编译器和配置文件 调用scripts/Kbuild.include 交叉编译工具变量设置 导出其他变量 U-Boot顶层Makefile分析…

TCP/IP网络编程(一)

TCP/IP网络编程读书笔记 第1章 理解网络编程和套接字1.1 理解网络编程和套接字1.1.1 构建打电话套接字1.1.2 编写 Hello World 套接字程序 1.2 基于Linux的文件操作1.2.1 底层访问和文件描述符1.2.2 打开文件1.2.3 关闭文件1.2.4 将数据写入文件1.2.5 读取文件中的数据1.2.6 文…

操作系统考试复习——第四章 存储器管理 4.1 4.2

存储器的层次结构&#xff1a; 存储器的多层结构&#xff1a; 存储器至少分为三级&#xff1a;CPU寄存器&#xff0c;主存和辅存。 但是一般分为6层为寄存器&#xff0c;高速缓存&#xff0c;主存储器&#xff0c;磁盘缓存&#xff0c;固定磁盘&#xff0c;可移动存储介质。…

( “ 图 “ 之 拓扑排序 ) 207. 课程表 ——【Leetcode每日一题】

❓207. 课程表 难度&#xff1a;中等 你这个学期必须选修 numCourses 门课程&#xff0c;记为 0 到 numCourses - 1 。 在选修某些课程之前需要一些先修课程。 先修课程按数组 prerequisites 给出&#xff0c;其中 prerequisites[i] [ai, bi] &#xff0c;表示如果要学习课…

自动驾驶中地图匹配定位技术总结

引言 汽车定位是让自动驾驶汽车知道自身确切位置的技术&#xff0c;在自动驾驶系统中担负着相当重要的职责。汽车定位涉及多种传感器类型和相关技术&#xff0c;主要可分为卫星定位、惯性导航定位、地图匹配定位以及多传感器融合定位几大类。其中地图匹配定位技术利用道路物理…

redis使用总结

目录 redis安装与登录redis 持久化RDB(Redis DataBase)AOF(Append Only File)RDB-AOF混合持久纯缓存模式 redis 的 keyredis 的数据类型和常见应用场景StringListHashMapSet集合ZSet有序集合bitmap位图HyperLogLog基数统计GEO 地理空间Stream 流bitfiled redis 事务事务的正常执…

【微机原理】8088/8086微处理器

目录 一、8088/8086的功能结构 1.总线接口部件&#xff08;BIU&#xff09; 2.执行部件&#xff08;EU&#xff09; 二、8088/8086的寄存器结构&#xff08;14个&#xff09; 溢出标志的概念 溢出和进位的区别 8086CPU是Intel系列的16位微处理器&#xff0c;他有16根数据…

servlet技术

什么是Servlet? Servlet 是 javaEE 规范之一. 规范就是接口 Servlet 是 javaWeb三大组件之一 三大组件分别是: Servlet程序, Flter过滤器, Listener监听器Servlet 是运行在服务器上的一个 java 小程序, 他可以接收客户端发送过来的请求, 并响应数据给客户端. 手动实现S…

电话号码的字母组合

题目&#xff1a;17. 电话号码的字母组合 - 力扣&#xff08;Leetcode&#xff09; 思路&#xff1a; 给定一个电话号码字符串 digits&#xff0c;须输出它所能表示的所有字母组合。我们可以先定义一个数字字符到字母表的映射表 numToStr&#xff0c;然后再用 Combine 函数递归…

Apache Kafka 进阶(一)

官网 Apache Kafka是一个开源的分布式事件流平台&#xff0c;被数千家公司用于高性能数据管道、流分析、数据集成和关键任务应用。 核心能力 高吞吐量 在网络有限的吞吐量下&#xff0c;使用延迟低至2ms的机器集群交付消息。可扩展性 将生产集群扩展到1000个代理&#xff0c…

互联网陪诊系统功能方案

互联网陪诊系统是一款为用户提供陪同患者到医院就医全程陪同&#xff0c;排队约号&#xff0c;排队检查&#xff0c;排队缴费&#xff0c;取送结果&#xff0c;代办买药&#xff0c;代办问诊等。 业务线上预约平台&#xff0c;让客户享受到最为专业的医院助医服务. 功能介绍 专…

阿里云g8i服务器Intel Xeon(Sapphire Rapids) Platinum 8475B

阿里云服务器ECS通用型实例规格族g8i采用2.7 GHz主频的Intel Xeon(Sapphire Rapids) Platinum 8475B处理器&#xff0c;3.2 GHz睿频&#xff0c;g8i实例采用阿里云全新CIPU架构&#xff0c;可提供稳定的算力输出、更强劲的I/O引擎以及芯片级的安全加固。阿里云百科分享阿里云服…

PMP项目管理-[第八章]质量管理

质量管理知识体系&#xff1a; 规划质量管理&#xff1a; 管理质量&#xff1a; 控制质量 &#xff1a; 8.1 质量和等级的区别 质量定义&#xff1a;作为实现的性能或成果&#xff0c;是一系列内在特性满足要求的程度 等级定义&#xff1a;作为设计意图&#xff0c;是对用途相同…

DP(9)--插头DP

DP(9)--插头DP /* Mondriaan’s Dream题目大意&#xff1a;在 N*M 的棋盘内铺满 1*2 或 2*1 的多米诺骨牌&#xff0c;求方案数。 砖只有横放和竖放两种状态&#xff0c;把横放记为两个0&#xff0c;竖放记为上1下0&#xff0c;逐格DP&#xff0c;每次无论前一格…

详解MySQL慢SQL定位、分析

目录 1.概述 2.慢SQL定位 3.SQL性能分析 3.1.例子 3.2.SQL性能分析 3.3.参数说明 3.3.1.id 3.3.2.select_type 3.3.3.key_len 3.3.4.rows 3.3.5.type 3.3.6.extra 1.概述 解决慢SQL的问题无非3步&#xff1a; 定位慢SQL分析慢SQL优化慢SQL 本文将按顺序介绍前两…

【MySQL】SQL优化

上一篇索引是针对查询语句进行优化,但在MySQL中可不仅有查询语句,针对其他的SQL语句同样也能进行优化 文章目录 1.插入数据2.主键优化3.order by 优化4.group by优化5.limit优化6.update优化 1.插入数据 插入数据所使用的关键字为insert,SQL语句为 insert into 表名(字段1,字…

恢复item2和oh-my-zsh的配置

1. 首先正常安装item2 2. 加载onedrive里的传家宝iterm2_default_profile.json&#xff0c;让iterm2的配置生效 2. 然后正常安装oh-my-zsh (官方步骤&#xff1a; sh -c "$(curl -fsSL https://raw.githubusercontent.com/ohmyzsh/ohmyzsh/master/tools/install.sh)&q…

BUUCTF ciscn_2019_c_1

小白垃圾做题笔记而已&#xff0c;不建议阅读。 1前期&#xff1a; 其实刚开始拿到程序的时候我还以为是逆向题放错地方了。唉&#xff0c;做题太少了。啥也不会。我是大笨蛋。 题目中用的是ubuntu18&#xff0c;我的ubuntu没怎么用过&#xff0c;vmtools都不能用&#xff0c…

什么是GPT模型,GPT下载和国内镜像

什么是GPT模型&#xff0c;GPT模型是通过预训练的方式&#xff0c;采用无监督学习方式&#xff0c;大量语料输入&#xff0c;经过多次训练后得到模型。它能够自动学习并理解自然语言中的语义、句法和语法信息&#xff0c;并可以用于文本生成、对话系统、情感分析、机器翻译等自…

零死角玩转stm32中级篇3-SPI总线

本篇博文目录: 一.基础知识1.什么是SPI2.SPI和IIC有什么不同3.SPI的优缺点4.SPI是怎么实现通信的5.SPI 数据传输的步骤6.SPI菊花链7.通过SPI实现数据的读和写 二.STM32F103C8T6芯片SPI协议案例代码 一.基础知识 1.什么是SPI SPI&#xff08;Serial Peripheral Interface&#…