Linux: 线程安全

news2024/9/21 16:49:12

Linux

线程共享了进程的资源(地址空间, 页表等), 多个线程同时访问同一个资源就可能产生问题:数据竞争

  • 临界资源: 多个线程共享的资源
  • 临界区: 访问临界资源的区域
  • 互斥: 任何时刻, 只有一个执行流能进入临界区
  • 同步: 以一定顺序访问临界资源
  • 原子性: 要么完成, 玩么未完成

  • 死锁:一组进程占有资源,不释放 + 互相申请, 导致永久等待的状态
  • 互斥锁:访问机制, 保证任何时刻, 只有一个线程能访问临界资源
  • 自旋锁:访问机制, 申请锁失败会一直检测锁的状态
  • 读写锁:读可并发, 写会独占资源. 一般适合读取数据次数 > 写数据的次数
  • 悲观锁:读取数据先加锁, 其它线程访问数据时会被阻塞
  • 乐观锁:读取数据时不加锁,更新数据时会比较数据是否被修改(被修改:重试或放弃等)

死锁

产生条件

  • 互斥条件:一个资源每次只能被一个执行流使用
  • 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放
  • 不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺
  • 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系

避免死锁

  • 破坏死锁的四个必要条件
  • 加锁顺序一致
  • 避免锁未释放的场景
  • 资源一次性分配

互斥锁

操作:

  • 头文件:<pthread.h>
  • int pthread_mutex_init(pthread_mutex_t *mutex)函数进行初始化
  • int pthread_mutex_lock(pthread_mutex_t *mutex)进行加锁(阻塞式)
  • int pthread_mutex_trylock(pthread_mutex_t *mutex)(非阻塞式)
  • int pthread_mutex_unlock(pthread_mutex_t *mutex)解锁
  • int pthread_mutex_destroy(pthread_mutex_t *mutex)销毁

原理:

  • lock:1.将0放入寄存器%al中  2. 把寄存器%al的值与内存中mutex的值做交换 3.如果al寄存器的内容>0 , 说明申请锁成功, 就返回0, 否则申请失败, 就挂起等待
  • unlock: 把1给内存中的mutex

条件变量

  • 概念: 是用于线程通信同步的机制, 通常与锁一起使用
  • 功能: 阻塞等待某种条件, 条件满足后继续执行(A线程等待B线程完成某种任务后,才向后执行)
  • 与锁一起使用: A线程在不满足条件时会释放锁, 直到条件就绪会重新获取锁然后继续执行

操作

头文件: <pthread.h>

pthread_cond_init

函数原型:int pthread_cond_init(pthread_cond_t *restrict cond, 
                      const pthread_condattr_t *restrict attr);
功能:初始化条件变量
参数:cond 是指向条件变量对象的指针,attr 是一个指向线程属性对象的指针,可以为 NULL。
返回值:调用成功返回0,失败返回错误码

pthread_cond_destroy

函数原型:int pthread_cond_destroy(pthread_cond_t *cond);
功能:销毁条件变量
参数:cond 是指向已初始化的条件变量对象的指针。
返回值:调用成功返回0,失败返回错误码。

pthread_cond_wait

函数原型:int pthread_cond_wait(pthread_cond_t *restrict cond,  
                            pthread_mutex_t *restrict mutex);
功能:等待条件变量,并在收到信号或广播时解除阻塞
参数:cond 是指向条件变量对象的指针,mutex 是与条件变量相关联的互斥锁。
返回值:调用成功返回0,失败返回错误码。
 
规范: 在while()中等待-->保证条件就绪的时候再被唤醒

pthread_cond_signal

功能:当条件满足时用来唤醒等待在条件变量上的一个线程。
函数原型:int pthread_cond_signal(pthread_cond_t *cond);
功能:唤醒一个等待在条件变量上的线程
参数:cond 是指向条件变量对象的指针。
返回值:调用成功返回0,失败返回错误码

pthread_cond_broadcast

函数原型:int pthread_cond_broadcast(pthread_cond_t *cond);
功能:唤醒所有等待在条件变量上的线程
参数:cond 是指向条件变量对象的指针。
返回值:调用成功返回0,失败返回错误码。

信号量

  • 概念: 一种软件资源(本质时计数器 ,对临界资源的预定机制)
  • 意义: 不用进入临界区就能知到资源情况(减少临界区内部的判断)

操作

头文件: <semaphore.h> <pthread.h>

sem_init

函数原型:int sem_init(sem_t *sem, int pshared, unsigned int value);
功能:初始化一个未命名的信号量
参数:
    sem 是指向信号量对象的指针,
    pshared 用于指示信号量是在进程间共享还是线程间共享,
    value 是信号量的初始值。
返回值:调用成功返回0,失败返回-1

sem_destory

函数原型:int sem_destroy(sem_t *sem);
功能:销毁一个未命名的信号量
参数:sem 是指向已初始化的信号量对象的指针
返回值:调用成功返回0,失败返回-1

sem_wait(申请信号量)

函数原型:int sem_wait(sem_t *sem);
功能:等待信号量,如果信号量的值大于0,将其减1;否则将线程阻塞,直到信号量的值大于0
参数:sem 是指向信号量对象的指针
返回值:调用成功返回0,失败返回-1

sem_post(释放信号量)

函数原型:int sem_post(sem_t *sem);
功能:释放信号量,将信号量的值加1,唤醒等待该信号量的线程
参数:sem 是指向信号量对象的指针
返回值:调用成功返回0,失败返回-1

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

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

相关文章

【Leetcode每日一题】 递归 - Pow(x, n)(难度⭐⭐)(40)

1. 题目解析 题目链接&#xff1a;50. Pow(x, n) 这个问题的理解其实相当简单&#xff0c;只需看一下示例&#xff0c;基本就能明白其含义了。 2.算法原理 在这个算法中&#xff0c;递归函数的任务是求出 x 的 n 次方。那么&#xff0c;这个函数是怎么工作的呢&#xff1f;它…

Linux_开发工具_yum_vim_gcc/g++_gdb_make/makefile_进度条_git_2

文章目录 一、Linux软件包管理器yum1. centos7 中安装软件方式2.安装&#xff0c;卸载&#xff0c;查看3.yum源4.安装lrzsz5.安装扩展源 二、Linux编辑器-vim1.安装vim2.vim的三种模式3.命令模式-文本批量化操作4.vim配置 三、Linux编译器-gcc/g使用1.安装2.gcc如何完成1、 预处…

安全工具介绍 SCNR/Arachni

关于SCNR 原来叫Arachni 是开源的&#xff0c;现在是SCNR&#xff0c;商用工具了 可试用一个月 Arachni Web Application Security Scanner Framework 看名字就知道了&#xff0c;针对web app 的安全工具&#xff0c;DASTIAST吧 安装 安装之前先 sudo apt-get update sudo…

qt5-入门-标签页部件QTabWidget-1

参考&#xff1a; C GUI Programming with Qt 4, Second Edition 本地环境&#xff1a; win10专业版&#xff0c;64位&#xff0c;Qt5.12 目录 效果实现Qt Designer操作代码addStretch()解释 效果 首页有三个按钮和最近文件列表。 拖动窗口&#xff0c;按钮和文件列表仍然处…

【算法与数据结构】总结

目录 引言 一、线性数据结构 1. 1 数组&#xff08;Array&#xff09; 1.2 链表&#xff08;Linked List&#xff09; 1.3 栈&#xff08;Stack&#xff09; 1.4 队列&#xff08;Queue&#xff09; 二、图形数据结构 2.1 深度优先搜索&#xff08;DFS&#xff09;&…

谈谈我对 AIGC 趋势下软件工程重塑的理解

作者&#xff1a;陈鑫 今天给大家带来的话题是 AIGC 趋势下的软件工程重塑。今天这个话题主要分为以下四大部分。 第一部分是 AI 是否已经成为软件研发的必选项&#xff1b;第二部分是 AI 对于软件研发的挑战及智能化机会&#xff0c;第三部分是企业落地软件研发智能化的策略…

VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准

文章目录 VPCFormer:一个基于transformer的多视角指静脉识别模型和一个新基准总结摘要介绍相关工作单视角指静脉识别多视角指静脉识别Transformer 数据库基本信息 方法总体结构静脉掩膜生成VPC编码器视角内相关性的提取视角间相关关系提取输出融合IFFN近邻感知模块(NPM) patch嵌…

使用jscpd对比重复代码

背景 检查项目中重复的代码&#xff0c;或者代码片段 jscpd 两个文件对比 Jscpd 是一个用于检测代码复制和粘贴的工具&#xff0c;它可以比较两个文件并报告相似性的百分比。 以下是如何使用 Jscpd 来比较两个文件的示例&#xff1a; 首先&#xff0c;确保你已经安装了 Nod…

数据库系统概论-第16章 数据仓库与联机分析处理技术

概念性的介绍&#xff0c;一略而过&#xff0c;不重要。 16.1 数据仓库技术 16.2 联机分析处理技术 16.3 数据挖掘技术 16.4 大数据时代的新型数据仓库 16.5 小结

大数据信用报告查询:三种查询方式揭秘,哪种更适合你?

了解大数据信用与人行信用的区别对于理解个人信用状况至关重要。本文将探讨大数据信用报告的查询方法&#xff0c;评估不同方式的优劣&#xff0c;并给出建议。 大数据信用报告的查询途径 1. 二维码分享查询 通过搜索引擎找到的相关文章可能会包含查询二维码。这类方式通常只提…

FMEA常见误区与能力提升方法——FMEA软件

免费试用FMEA软件-免费版-SunFMEA 新版FMEA&#xff08;故障模式与影响分析&#xff09;作为一种重要的质量管理工具&#xff0c;被广泛应用于产品设计、生产和服务等领域。然而&#xff0c;在实际应用中&#xff0c;许多组织和个人常常陷入一些误区&#xff0c;导致FMEA的效果…

浅谈Javascript虚拟列表(virtaul list)改造成虚拟表格(virtaul table)的技术

前端加载百万条数据列表&#xff0c;如果采用真实的DOM插入100万个div&#xff08;或li&#xff09;标签&#xff0c;肯定是非常卡顿的。这就不得不使用虚拟列表技术方案&#xff0c;但是虚拟列表技术方案网上有很详细的实现方法&#xff0c;今天我就来谈谈根据网上的方案&…

【软考高项】十六、信息系统工程之安全工程

1、基础概念 定义&#xff1a;建造一个信息安全系统&#xff0c;它是整个信息系统工程的一部分&#xff0c;而且最好是与业务应用信息系统工程同步进行&#xff0c;主要围绕“信息安全”内容 信息安全系统三维空间&#xff1a; 包括安全机制、网络参考模型和安全服务 X轴是…

23 OpenCV 直方图比较

文章目录 直方图比较的目的相关性计算 (CV_COMP_CORREL)卡方计算 (CV_COMP_CHISQR)十字计算(CV_COMP_INTERSECT)巴氏距离计算 (CV_COMP_BHATTACHARYYA )compareHist 直方图比较算子示例 直方图比较的目的 直方图比较的目的是衡量两幅图像之间的相似度或差异度。通过计算图像的颜…

如何在 Windows 中恢复永久删除的文件

即使您从电脑或笔记本电脑中永久删除文件或文档&#xff0c;您也可以轻松恢复它们。因此&#xff0c;在本文的帮助下&#xff0c;我们将了解一些轻松恢复丢失数据的最佳和最值得信赖的方法。 生活中&#xff0c;难免会发生错误。这就是我们作为个人学习和成长的方式。这些错误…

OSError: We couldn‘t connect to ‘https://huggingface.co‘ to load this file

想折腾bert的同学&#xff0c;应该也遇到这个问题。 一、报错信息分析 完整报错信息&#xff1a;OSError: We couldnt connect to https://huggingface.co to load this file, couldnt find it in the cached files and it looks like google/mt5-small is not the path to a…

比堆垛机方案省电65% 实施快50% 四向车系统柔性化建设进程异军突起

对物流企业来说&#xff0c;供应链的数智化升级并非“赶时髦”&#xff0c;它需要找到一个既懂物流行业&#xff0c;又有数字化技术作基础的仓储方案提供商。而河北沃克基于AI底层技术、软硬一体化产品体系和技术创新行业经验双轮驱动的业务团队等“技术产品人才”三位一体优势…

杭州克鲁斯机器人控制信号线缆故障维修攻略,快来了解一下!

克鲁斯机器人作为工业自动化的重要组成部分&#xff0c;其稳定运行对于生产效率至关重要。克鲁斯机器人控制信号线缆作为机器人与外部控制设备之间的桥梁&#xff0c;承担着传输指令和反馈信号的重要任务。 一、克鲁斯机器人控制信号线缆故障识别与诊断 故障现象&#xff1a;当…

人工智能时代的引领者:AI提示工程激发大语言模型的无限潜能

文章目录 一、AI提示工程的概念与定义二、AI提示工程的应用领域三、AI提示工程的技术创新与突破四、AI提示工程的未来发展趋势《AI提示工程实战&#xff1a;从零开始利用提示工程学习应用大语言模型》亮点内容简介作者简介目录 一、AI提示工程的概念与定义 在当今日新月异的科…

【Python】为什么能用 tuple 的地方就不用 list

元组(tuple)和列表(list)的区别 相对于 list 而言&#xff0c;tuple 内的元素是不可变的&#xff0c;也就是tuple 不可对元素进行增删tuple是静态的固定大小的&#xff0c;而list是动态分配存储空间&#xff0c;自动扩容的。 内存比较 代码 listtest [1,2,3,4] tupletest …