Linux: 线程安全

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.mzph.cn/news/762631.shtml

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

相关文章

什么快递可以寄摩托车?看你要啥样的了

一辆49cc的二冲程摩托车仅需561元。 购买125的组装车不会超过1元&#xff0c;购买250品牌发动机的组装车不会超过4000元。 购买一辆名牌摩托车大约需要4000到10000元。 花一万到两百万多就能买到一辆像样、动力强劲、能玩的炫酷摩托车。 哈哈&#xff0c;就看你想要什么了&…

20240309web前端_第二周作业_完成游戏导航栏

作业&#xff1a;游戏导航栏 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0…

centos系统ssh7.4升级9.6

编译安装 OpenSSL 下载 OpenSSL 源代码&#xff1a; wget https://www.openssl.org/source/openssl-1.1.1w.tar.gz这个命令从 OpenSSL 的官方网站下载指定版本&#xff08;1.1.1w&#xff09;的源代码压缩包。 解压源代码&#xff1a; tar zxvf openssl-1.1.1w.tar.gz使用 tar…

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

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

Godot 学习笔记(4):一切以场景为中心

文章目录 前言场景搭建新建子场景最简单的按钮事件 手动控制场景手动加载场景添加多个场景对象更快速的获取脚本对象 删除多个场景对象脚本命名的问题 总结 前言 Godot的场景是C#与Godot最后的中间连接。我们解决了场景的加载&#xff0c;我们基本可以保证C#和godot之间的彻底…

JVM的知识

什么是JVM 1.JVM&#xff1a; JVM其实就是运行在 操作系统之上的一个特殊的软件。 2.JVM的内部结构&#xff1a; &#xff08;1&#xff09;因为栈会将执行的程序弹出栈。 &#xff08;2&#xff09;垃圾99%的都是在堆和方法区中产生的。 类加载器&#xff1a;加载class文件。…

处理 input type=‘hidden‘ 的事件触发

前言 在公司的 MES 系统&#xff08;摩尔元数N2&#xff09;做二次开发页面。某个字段在表单模型中配置为 弹出窗口 后、页面的对应字段样式自动转为 <input type"hidden"> &#xff0c;从而导致不能使用常规的 blur 、keydown 事件触发关联操作。下面是解决思…

【力扣刷题日记】603.连续空余座位

前言 练习sql语句&#xff0c;所有题目来自于力扣&#xff08;https://leetcode.cn/problemset/database/&#xff09;的免费数据库练习题。 今日题目&#xff1a; 603.连续空余座位 表&#xff1a;Cinema 列名类型seat_idintfreebool Seat_id 是该表的自动递增主键列。 在…

将表格数据导出 Excel 格式的数据方法(2)

1、在工具类中创建一个脚本文件 /*** param {*} tableValueData* 表格数据: []* param {*} tableTitleData* 表格标题数据: ["", "", "", ""]* param {*} fileName* 文件名* param {*} tableHeader* 表格名*/// …

【RabbitMQ | 第一篇】消息队列基础知识

文章目录 1.消息队列基础知识1.1什么是消息队列&#xff1f;1.2消息队列有什么用&#xff1f;&#xff08;结合项目说&#xff09;1.2.1异步处理1.2.2削峰/限流1.2.3降低系统耦合性1.2.4实现分布式事务 1.3消息队列的缺点1.4JMS和AMQP1.4.1 JMS的两种消息模型&#xff08;1&…

高效备考2024年AMC10:吃透2000-2023年1250道真题(限时免费送)

我们今天继续来随机看5道AMC10真题&#xff0c;以及详细解析&#xff0c;这些题目来自1250道完整的官方历年AMC10真题库。通过系统研究和吃透AMC10的历年真题&#xff0c;参加AMC10的竞赛就能拿到好名次。即使不参加AMC10竞赛&#xff0c;掌握了这些知识和解题思路后初中和高中…

Google 的 C++编程规范

1.1 头文件均使用 #define guards #ifndef <PROJECT>_<PATH>_<FILE>_H_ #define <PROJECT>_<PATH>_<FILE>_H_...#endif // <PROJECT>_<PATH>_<FILE>_H_1.2 包含所有使用到的头文件 只要头文件中引用了其他文件中的符…

mysql基础01

登录 and 修改密码 登录 mysql //默认用户root ,主机名为localhost,密码为空,端口为3306 mysql -uroot -p123 -hlocalhost -p3306 //如果-p后无密码,可以通过非明文实现登录修改密码 mysqladmin -uroot -p password 123 //在root密码为空的情况下可以设置密码,否则需要旧密…

#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行

3 月 19 日&#xff0c;#鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行。 现场&#xff0c;深圳市南山区人民政府副区长李志娜发布《2024 年南山区支持鸿蒙原生应用发展首批政策措施清单》&#xff0c;从加强鸿蒙原生应用供给能力、推动鸿蒙原生应用产业集聚、完善鸿蒙原生…

扩容分区和文件系统(Linux)

在ECS控制台上扩容云盘容量后&#xff0c;对应分区和文件系统并未扩容&#xff0c;您还需要进入ECS实例内部继续扩容云盘的分区和文件系统&#xff0c;将扩容部分的容量划分至已有分区及文件系统内&#xff0c;使云盘扩容生效。本文为您介绍如何通过两个步骤完成Linux实例云盘的…

API 接口渗透测试

1 API 接口介绍 1.1 RPC&#xff08;远程过程调用&#xff09; 远程过程调用&#xff08;英语&#xff1a;Remote Procedure Call&#xff0c;缩写为 RPC&#xff09;是一个计算机通信协议。该协议允许运行于一台计算机的程序调用另一台计算机的子程序&#xff0c;而程序员无…

RecyclerView万能适配器之BaseQuickAdapter方法详解

BaseQuickAdapter方法详解 1. setNewData(List<T> data)2. addData(List<T> data)3. replaceData(int index, List<T> data) 这篇文章我们主要对BaseQuickAdapter的setNewData()、addData()、和 replaceData() 三个方法进行讲解 1. setNewData(List data) …

JavaScript高级(十三)---ES6中Set,map

ES6 Set 在ES6之前&#xff0c;我们存储数据的结构主要有两种&#xff1a;数组、对象。 在ES6中新增了另外两种数据结构&#xff1a;Set、Map&#xff0c;以及它们的另外形式WeakSet、WeakMap。 Set是一个新增的数据结构&#xff0c;可以用来保存数据&#xff0c;类似于数组&a…

应用APM-如何配置Prometheus + Grafana监控springboot应用

文章目录 概述在Spring Boot应用中集成Micrometerspringboot配置修改 Docker安装Prometheus和Grafanaprometheus配置grafana配置启动Prometheus和Grafana在Grafana中配置数据源创建Grafana仪表盘配置Grafana告警&#xff08;可选&#xff09;监控和分析 概述 配置Prometheus和…

前缀列表和route-policy

前缀列表和route-policy ACL&#xff1a;访问控制列表 1、它可以用于过滤流量报文 2、又可以过滤路由条目 前缀列表&#xff1a; 1、只能过滤路由条目 2、不能过滤流量报文 ACL&#xff1a;在过滤路由条目时&#xff0c;只能过滤路由前缀。 前缀列表&#xff1a;在过滤…