解锁线程安全,可重入与不可重入函数相关概念,以及死锁问题的根源与应对策略


🍑个人主页:Jupiter. 🚀 所属专栏:Linux从入门到进阶 欢迎大家点赞收藏评论😊

目录


🐎可重入VS线程安全

🦈概念

  • 线程安全:多个线程并发同一段代码时,不会出现不同的结果。常见对全局变量或者静态变量进行操作,并且没有锁保护的情况下,会出现该问题。
  • 重入:同一个函数被不同的执行流调用,当前一个流程还没有执行完,就有其他的执行流再次进入,我们称之为重入。一个函数在重入的情况下,运行结果不会出现任何不同或者任何问题,则该函数被称为可重入函数,否则,是不可重入函数。其中,引起线程安全的情况有很多种,引入不可重入函数是其中的一种常见情况。

🐬常见的线程不安全的情况

  • 不保护共享变量的函数。
  • 函数状态随着被调用,状态发生变化的函数。
  • 返回指向静态变量指针的函数。
  • 调用线程不安全函数的函数。

🦀常见的线程安全的情况

  • 每个线程对全局变量或者静态变量只有读取的权限,而没有写入的权限,一般来说这些线程是安全的。
  • 类或者接口对于线程来说都是原子操作。
  • 多个线程之间的切换不会导致该接口的执行结果存在二义性。

🐢常见不可重入的情况

  • 调用了malloc/free函数,因为malloc函数是用全局链表来管理堆的。
  • 调用了标准I/O库函数,标准I/O库的很多实现都以不可重入的方式使用全局数据结构。
  • 可重入函数体内使用了静态的数据结构。

🐍常见可重入的情况

  • 不使用全局变量或静态变量。
  • 不使用malloc或者new开辟出的空间。
  • 不调用不可重入函数。
  • 不返回静态或全局数据,所有数据都有函数的调用者提供。
  • 使用本地数据,或者通过制作全局数据的本地拷贝来保护全局数据。

🐚可重入与线程安全联系

  • 函数是可重入的,那就是线程安全的。
  • 函数是不可重入的,那就不能由多个线程使用,有可能引发线程安全问题。
  • 如果一个函数中有全局变量,那么这个函数既不是线程安全也不是可重入的。

🐂可重入与线程安全区别

  • 可重入函数是线程安全函数的一种。
  • 线程安全不一定是可重入的,而可重入函数则一定是线程安全的。
  • 如果将对临界资源的访问加上锁,则这个函数是线程安全的,但如果这个重入函数若锁还未释放则会产生死锁,因此是不可重入的。

🐏常见锁概念

🐇死锁

  • 死锁是指:多线程的锁不合理的使用,导致代码不会向后继续推进的情况。

常见的死锁的情况:

  • 在解锁的时候,误写成了加锁;
  • 访问一个资源的时候,需要同时持有两把锁,但是在申请的锁的时候的顺序不同,导致线程A在申请锁1的同时,线程B在申请锁2,导致线程A申请不到锁2,线程B申请不到锁1,导致线程一直不能同时持有两把锁,导致代码不会继续推进。

🦆死锁四个必要条件(面试题)

  • 互斥条件:一个资源每次只能被一个执行流使用。
  • 请求与保持条件:一个执行流因请求资源而阻塞时,对已获得的资源保持不放(可以使用pthread_mutex_trylock(pthread_mutex *mutex);破坏该条件)。
  • 不剥夺条件:一个执行流已获得的资源,在末使用完之前,不能强行剥夺。
  • 循环等待条件:若干执行流之间形成一种头尾相接的循环等待资源的关系(申请锁的顺序相同即可破坏)。

🐀避免死锁

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

🐄避免死锁算法

  • 死锁检测算法。
  • 银行家算法。

相关推荐
Re.不晚几秒前
Java入门15——抽象类
java·开发语言·学习·算法·intellij-idea
雷神乐乐6 分钟前
Maven学习——创建Maven的Java和Web工程,并运行在Tomcat上
java·maven
码农派大星。10 分钟前
Spring Boot 配置文件
java·spring boot·后端
王佑辉13 分钟前
【redis】redis缓存和数据库保证一致性的方案
redis·面试
vip45114 分钟前
Linux 经典面试八股文
linux
大霞上仙16 分钟前
Ubuntu系统电脑没有WiFi适配器
linux·运维·电脑
顾北川_野17 分钟前
Android 手机设备的OEM-unlock解锁 和 adb push文件
android·java
江深竹静,一苇以航19 分钟前
springboot3项目整合Mybatis-plus启动项目报错:Invalid bean definition with name ‘xxxMapper‘
java·spring boot
weixin_4426434235 分钟前
推荐FileLink数据跨网摆渡系统 — 安全、高效的数据传输解决方案
服务器·网络·安全·filelink数据摆渡系统
confiself35 分钟前
大模型系列——LLAMA-O1 复刻代码解读
java·开发语言