Linux -- 死锁、自旋锁

news2025/1/7 5:13:59

目录

死锁

概念

死锁的四个必要条件

避免死锁的发生

自旋锁

概念

pthread_spin_init(初始化自旋锁)

pthread_spin_lock(申请自旋锁)

pthread_spin_unlock(释放自旋锁)

pthread_spin_destroy(销毁自旋锁)


死锁

概念

死锁(Deadlock)是指两个或多个进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,这些进程将无法继续推进。

举例来说,现在有线程 A 和线程 B,这两个线程都需要同时持有互斥锁 1 和互斥锁 2 才可以向后推进,访问临界资源,此时 线程 A 拿到了互斥锁 1,线程 B 拿到了互斥锁 2,两个线程都申请对方持有的锁,但是谁都不肯释放锁,导致谁都无法同时持有两把锁,那么这两个线程就互相等待,都不向后推进了,导致死锁!

死锁的四个必要条件

  1. 互斥条件:一个资源每次只能被一个执行流使用。
  2. 占有并等待条件:一个进程必须已经持有至少一个资源,并等待获取当前被其他进程占用的额外资源。
  3. 不可剥夺条件:资源不能从进程那里强行夺取,只有拥有该资源的进程可以主动释放资源。
  4. 循环等待条件:若干执行流之间形成一种头尾相连的循环等待资源的关系。即存在一组等待的进程{P1, P2, ..., PN},其中每个Pi正在等待由Pi+1持有的资源,PN等待由P1持有的资源。

避免死锁的发生

  • 只要破坏死锁的四个必要条件之一,就可以避免死锁!
  • 尽量缩短持有锁的时间,只在绝对必要的时候才获取锁,并尽快释放。
  • 确保所有线程总是按照相同的顺序获取锁,以防止循环等待。
  • 要求每个进程在开始执行之前一次性申请所有需要的资源。这种方法可以完全避免死锁,但可能导致资源利用率低下。

自旋锁

概念

自旋锁(Spinlock)是一种同步机制,主要用于多处理器系统中保护共享资源。与传统的互斥锁不同,当一个线程尝试获取已经被占用的自旋锁时,它不会立即进入睡眠状态(阻塞),而是会不停地循环检查锁的状态(忙等待或自旋),直到锁被释放。这种方式可以减少上下文切换带来的开销,但在锁持有时间较长的情况下,可能会浪费大量的CPU周期。

自旋锁最适合用于锁持有时间非常短暂的情形,例如保护少量数据或执行简单操作时。在这些情况下,上下文切换的成本可能超过自旋等待的成本。此外,在实时系统中,为了确保响应时间尽可能短,也常常使用自旋锁。

pthread_spin_init(初始化自旋锁)

#include <pthread.h>

int pthread_spin_init(pthread_spinlock_t *lock, int pshared);

lock:指向要初始化的自旋锁对象的指针

pshared:指示该自旋锁是否可以在进程间共享。取值有两种:

  • PTHREAD_PROCESS_PRIVATE (0):默认值,表示该锁只能被同一进程内的线程共享
  • PTHREAD_PROCESS_SHARED (非0):表示该锁可以被多个进程中的线程共享。

返回值

  • 成功时返回 0
  • 如果发生错误,则返回一个正整数错误码,并且不会初始化自旋锁。

pthread_spin_lock(申请自旋锁)

#include <pthread.h>

int pthread_spin_lock(pthread_spinlock_t *lock);

lock: 指向要获取的自旋锁对象的指针。

返回值:

  • 成功时返回 0
  • 如果发生错误,则返回一个正整数错误码。

pthread_spin_unlock(释放自旋锁)

#include <pthread.h>

int pthread_spin_unlock(pthread_spinlock_t *lock);

 lock: 指向要释放的自旋锁对象的指针。

返回值:

  • 成功时返回 0
  • 如果发生错误,则返回一个正整数错误码。

pthread_spin_destroy(销毁自旋锁)

#include <pthread.h>

int pthread_spin_destroy(pthread_spinlock_t *lock);

lock: 指向要销毁的自旋锁对象的指针。

返回值:

  • 成功时返回 0
  • 如果发生错误,则返回一个正整数错误码。

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

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

相关文章

df.groupby()方法使用表达式分组

# 索引值是否为偶数&#xff0c;分成两组 df.groupby(lambda x:x%20).sum() df.groupby(df.index%20).sum() # 同上这两个写法看似相似&#xff0c;确实都基于索引值来进行分组&#xff0c;但在实现方式上有细微的区别&#xff1a; df.groupby(lambda x: x % 2 0) 这种方式通过…

Python 数据可视化的完整指南

目录 一、为什么选择 Python 进行数据可视化? 二、常用 Python 可视化库及其特点 三、常用图表类型及其代码示例 折线图:用于展示数据随时间或其他连续变量的变化趋势。 柱状图:用于比较不同类别的数据大小。 散点图:用于展示两个变量之间的关系,并发现数据中的模式…

国内Ubuntu环境Docker部署CosyVoice

国内Ubuntu环境Docker部署CosyVoice 本文旨在记录在 国内 CosyVoice项目在 Ubuntu 环境下如何使用 dockermin-conda进行一键部署。 源项目地址&#xff1a; https://github.com/FunAudioLLM/CosyVoice 如果想要使用 dockerpython 进行部署&#xff0c;可以参考我另一篇博客中的…

Git的使用流程(详细教程)

目录 01.Git是什么&#xff1f; 1.1 Git简介 1.2 SVN与Git的最主要的区别 1.3 GIt主要特点 02.Git是干什么的&#xff1f; 2.1.Git概念汇总 2.2 工作区/暂存区/仓库 2.3 Git使用流程 03.Git的安装配置 3.1 Git的配置文件 3.2 配置-初始化用户 3.3 Git可视化…

ImageNet 2.0?自动驾驶数据集迎来自动标注新时代

引言&#xff1a; 3DGS因其渲染速度快和高质量的新视角合成而备受关注。一些研究人员尝试将3DGS应用于驾驶场景的重建。然而&#xff0c;这些方法通常依赖于多种数据类型&#xff0c;如深度图、3D框和移动物体的轨迹。此外&#xff0c;合成图像缺乏标注也限制了其在下游任务中的…

npm install --global windows-build-tools --save 失败

注意以下点 为啥下载windows-build-tools&#xff0c;是因为node-sass4.14.1 一直下载不成功&#xff0c;提示python2 没有安装&#xff0c;最终要安装这个&#xff0c;但是安装这个又失败&#xff0c;主要有以下几个要注意的 1、node 版本 14.21.3 不能太高 2、管理员运行 …

Beamer-LaTeX学习(教程批注版)【1】

该文档总体由beamer-latex的教程而来&#xff0c;由耳东小白以自身学习路径整理。因其中要点基本按照教程的顺序和结构整理&#xff0c;故而不能称之为完全原创&#xff0c;但也不是翻译&#xff0c;更不是抄袭&#xff0c;是个人自学笔记和批注&#xff0c;其中添加了小白个人…

wx005基于springboot+vue+uniapp的大学生心理健康测评管理系统小程序

开发语言&#xff1a;Java框架&#xff1a;springbootuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#…

SpringBoot整合springmvc、扩展springmvc

目录 一、 SpringMVC三大组件二、 Spring MVC 组件的自动管理2.1 中央转发器&#xff08;DispatcherServlet&#xff09;2.2 控制器2.3 视图解析器自动管理2.4 静态资源访问2.5 消息转换和格式化2.6 欢迎页面的自动配置 三、Springboot扩展springmvc3.1 视图控制器注册&#xf…

STM32使用UART发送字符串与printf输出重定向

首先我们先看STM32F103C8T6的电路图 由图可知&#xff0c;其PA9和PA10引脚分别为UART的TX和RX(注意&#xff1a;这个电路图是错误的&#xff0c;应该是PA9是X而PA9是RX&#xff0c;我们看下图的官方文件可以看出)&#xff0c;那么接下来我们应该找到该引脚的定义是什么&#xf…

力扣28找出字符串中第一个匹配项的下标

class Solution:def strStr(self, haystack: str, needle: str) -> int:# 特殊情况处理if not needle:return 0# 获取 haystack 和 needle 的长度a len(needle)b len(haystack)# 遍历 haystack&#xff0c;检查每个子字符串是否与 needle 匹配for i in range(b - a 1):if…

8、RAG论文笔记(Retrieval-Augmented Generation检索增强生成)

RAG论文笔记 1、 **研究背景与动机**2、方法概述3、RAG 模型架构3.1总体架构3.2 Generator&#xff08;生成器&#xff09;3.3 检索器&#xff08;Retriever&#xff09;3.4训练&#xff08;Training&#xff09;3.5**解码方法**&#xff08;求近似 &#xff09;3.6微调的参数 …

PCA降维算法详细推导

关于一个小小的PCA的推导 文章目录 关于一个小小的PCA的推导1 谱分解 (spectral decomposition)2 奇异矩阵(singular matrix)3 酉相似(unitary similarity)4 酉矩阵5 共轭变换6 酉等价7 矩阵的迹的计算以及PCA算法推导8 幂等矩阵(idempotent matrix)9 Von Neumanns 迹不等式 [w…

Android studio 旧版本下载,NDK旧版本下载

记录一下旧版的ndk 和 Android studio 官方下载备份。 1.NDK 旧版本下载地址 下载地址&#xff1a;https://github.com/android/ndk/wiki/Unsupported-Downloads 2.Android studio 旧版本下载 下载地址 https://developer.android.com/studio/archive 如果出现以下页面 点击…

开源存储详解-分布式存储与ceph

ceph体系结构 rados&#xff1a;reliable, autonomous, distributed object storage, rados rados采用c开发 对象存储 ceph严格意义讲只提供对象存储能力&#xff0c;ceph的块存储能力实际是基于对象存储库librados的rbd 对象存储特点 对象存储采用put/get/delete&#xf…

Midjourney Imagine API 使用

Midjourney Imagine API 申请及使用 Midjourney 是一款非常强大的 AI 绘图工具&#xff0c;只要输入关键字&#xff0c;就能在短短一两分钟生成十分精美的图像。Midjourney 以其出色的绘图能力在业界独树一帜&#xff0c;如今&#xff0c;Midjourney 早已在各个行业和领域广泛…

docker从下载到Python项目打包到容器中运行(解决下拉超时问题)

docker安装&#xff08;如果第一步或者第二步没有成功&#xff0c;说明是你的镜像源有问题&#xff0c;私聊我获取镜像源&#xff09;镜像位置_/etc/yum.repos.d/CentOS-Base.repo sudo yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/dock…

运算指令(PLC)

加 ADD 减 SUB 乘 MUL 除 DIV 浮点运算 整数运算

Linux高级--3.2.5 “外挂式”死锁监测设计

一、生活中“死锁”的场景 三个人&#xff0c;甲乙丙&#xff0c; 甲借了丙的钱&#xff0c;丙借了乙的钱&#xff0c;乙借了甲的钱。 甲找乙还钱&#xff0c;乙说&#xff1a;“别人还我 我就还你 ”&#xff0c;甲说&#xff1a;“好&#xff0c;那我等你” 乙找丙还钱&am…

图像去雾 | 基于Matlab的图像去雾系统(四种方法)

图像去雾 | 基于Matlab的图像去雾系统&#xff08;四种方法&#xff09; 目录 图像去雾 | 基于Matlab的图像去雾系统&#xff08;四种方法&#xff09;效果一览基本介绍程序设计参考资料 效果一览 基本介绍 基于Matlab的图像去雾系统&#xff08;四种方法&#xff09; 关于图像…