【Linux】线程与线程安全知识总结

在这里插入图片描述

向外张望的人在做梦,
向内审视的人才是清醒的。
--- 荣格 ---

我最近复习了线程安全这部分知识,将不明白的问题总结出来,并通过AI进行问答帮助我进行学习巩固。本人能力有限 ,可能有些内容不准确,望各位大佬海涵!!!

线程与线程安全知识总结

  • 1 请简述线程安全概念与实现
  • 2 死锁发生的必要条件和避免措施
  • 3 请简述线程池的作用与实现原理
  • 4 简述并发编程的特性
  • 5 信号量实现与条件变量有什么区别?
  • 6 简述什么是线程同步,为什么需要同步

1 请简述线程安全概念与实现

线程安全指的是在多线程编程中,多个线程对临界资源进行争抢访问而不会造成数据二义或程序逻辑混乱的情况。当多个线程访问同一资源时,这些线程不会相互干扰,程序的行为仍然符合预期,不会出现数据不一致或错误的结果。
线程安全的实现,通过同步与互斥实现!

线程的同步和互斥是确保多线程程序正确执行的关键技术,具体互斥的实现可以通过互斥锁和信号量实现、而同步可以通过条件变量与信号量实现。

  1. 互斥锁(Mutexes):通过互斥锁可以保证同一时间只有一个线程访问共享资源,其他线程必须等待锁被释放后才能访问。
  2. 读写锁(Read-Write Locks):允许多个读操作同时进行,但写操作会独占锁,用于读多写少的场景。
  3. 条件变量(Condition Variables):允许线程在某些条件下挂起或被唤醒,常与互斥锁结合使用。
  4. 原子操作(Atomic Operations):提供原子性的数据操作,确保在多线程环境中对数据的修改是安全的。
  5. 线程局部存储(Thread-Local Storage, TLS):为每个线程提供独立的变量副本,从而避免共享。我们实现高并发内存池中有所使用!!!

2 死锁发生的必要条件和避免措施

死锁发生的四个必要条件:

  1. 互斥条件:资源不能被多个进程同时使用,只能由一个进程独占直到该进程释放资源。
  2. 占有和等待条件:进程至少持有一个资源,并且正在等待获取额外的资源,而该资源又被其他进程持有。
  3. 不可抢占条件:已经分配给进程的资源在未使用完毕之前不能被其他进程强行抢占。
  4. 循环等待条件:存在一种进程资源的循环等待链,每个进程至少持有一个资源,并等待获取下一个进程所持有的资源。

解决死锁的方法就是破坏死锁发生的必要条件,这样就可以避免死锁发生:

  1. 破坏互斥条件:
    • 尽可能使资源可共享,但这在许多情况下不可行,因为有些资源(如打印机)本质上就是互斥的。
  2. 破坏持有和等待条件:
    • 要求线程在开始执行前一次性声明所有需要的资源。
    • 如果无法一次性获取所有资源,线程可以在持有部分资源的情况下释放它们,然后重新尝试获取全部资源。
  3. 破坏非抢占条件:
    • 允许线程抢占资源,但这可能导致系统复杂度和不确定性增加。
    • 实现抢占式调度策略,可以在一定条件下强制回收资源。
  4. 破坏循环等待条件:
    • 对所有资源类型进行排序,并要求线程只能按照顺序请求资源。
    • 通过资源分级避免循环等待。

上面是方法理论,我们可以通过以下这些具体的方法来避免死锁:

  1. 资源分配策略:避免动态资源分配,而是预先分配资源。使用银行家算法来避免系统进入不安全状态。
  2. 锁的顺序:确保所有线程以相同的顺序请求和释放锁。
  3. 超时机制:如果线程在一段时间内没有获取到锁,则放弃并重新尝试。

3 请简述线程池的作用与实现原理

面试简述:

线程池通过一个线程安全的阻塞任务队列加上一个或一个以上的线程实现,线程池中的线程可以从阻塞队列中获取任务进行任务处理,当线程都处于繁忙状态时可以将任务加入阻塞队列中,等到其它的线程空闲后进行处理。
可以避免大量线程频繁创建或销毁所带来的时间成本,也可以避免在峰值压力下,系统资源耗尽的风险;并且可以统一对线程池中的线程进行管理,调度监控。

线程池项目之前的文章有详细讲过。其使用的是资源复用的思想,通过池化技术来实现:

池化技术(Pooling)是一种在计算机科学中常用的资源管理技术,其核心思想是预先分配并管理一定数量的资源,当需要使用资源时,不是每次都重新创建新的资源,而是从预先分配的资源池中取出资源进行使用,使用完毕后再归还到资源池中,以供后续重用。这种技术可以显著减少资源创建和销毁的开销,提高资源利用率,降低系统延迟。

4 简述并发编程的特性

  1. 原子性:C++中的原子操作保证了对共享数据的修改在多线程环境中是不可分割的,即其他线程看不到操作的一半状态,确保了数据的一致性。
  2. 可见性:C++通过内存模型保证,当线程对共享变量进行写操作后,其他线程能够立即看到这些修改,避免了读取到旧数据的问题。
  3. 有序性:C++的内存模型确保了程序中的操作按照特定的顺序执行,防止编译器和处理器对指令进行重排序,从而保证了多线程环境下的执行顺序与代码中的顺序一致。

5 信号量实现与条件变量有什么区别?

  • 条件变量提供了一个pcb阻塞队列以及阻塞和唤醒线程的接口用于实现同步,但是什么时候该唤醒以及什么时候该阻塞线程由程序员进行控制,而这个控制通常需要一个共享资源的条件判断完成,因此条件变量还需要搭配互斥锁使用,来保护这个共享资源的条件判断及操作。

  • 信号量提供一个pcb等待队列,以及一个实现了原子操作的对资源进行计数的计数器,通过自身计数器实现同步的条件判断,因此不需要搭配互斥锁使用,而且信号量在初始化计数为1的情况下也可以模拟实现互斥操作。

6 简述什么是线程同步,为什么需要同步

线程同步是指通过特定的机制协调多个线程的执行,使得它们能够按照一定的顺序或条件访问共享资源,避免并发执行时产生的数据竞争和状态不一致问题。

为什么需要同步:

  • 防止竞态条件:当多个线程同时访问和修改同一数据时,没有适当的同步可能导致不可预测的结果。
  • 保持数据一致性:同步机制确保共享数据的修改对其他线程可见,维护数据的正确性。
  • 控制执行顺序:在某些情况下,需要确保某些操作按照特定的顺序执行,同步可以提供这种控制。
  • 避免死锁和饥饿:合理的同步策略有助于避免线程因资源争夺而无法继续执行的情况。

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

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

相关文章

【前端开发入门】css快速入门

目录 引言一、css盒模型1. 盒模型概念2. 盒模型案例 二、css编写1. html文件内部编写1.1 标签style属性编写1.2 css选择器关联1.2.1 id选择器1.2.2 class选择器1.2.3 标签选择器1.2.4 css选择器作用域1.2.5 其他选择器1.2.6 各css选择器优先级 2. 单独维护css文件2.1 创建css文…

HDLBits中文版,标准参考答案 | 3.1.4 Karnaugh Map to Circuit | 卡诺图到电路

关注 望森FPGA 查看更多FPGA资讯 这是望森的第 11 期分享 作者 | 望森 来源 | 望森FPGA 目录 1 3 变量 2 4 变量 3 4 变量 4 4 变量 5 最小 SOP 和 POS 6 卡诺图 7 卡诺图 8 使用多路复用器实现的卡诺图 本文中的代码都能够正常运行,请放心食用&#x1f…

最强AI绘画大模型Flux可以在SDWebUI 上使用了!超便捷的Flux模型使用教程!AI绘画零基础入门到实战教程

大家好,我是画画的小强 目前最强的AI绘画大模型Flux.1 横空出世有段时间了,模型效果也得到了广泛的认可,但是 Stable Diffusion WebUI 官方迟迟没有跟进,据说是因为要修改很多底层的处理机制,加之ComfyUI如火如荼&…

Nginx的基础讲解之重写conf文件

一、Nginx 1、什么是nginx? Nginx(engine x)是一个高性能的HTTP和反向代理web服务器,同时也提供了IMAP/POP3/SMTP服务。 2、用于什么场景 Nginx适用于各种规模的网站和应用程序,特别是需要高并发处理和负载均衡的场…

【React】事件机制

事件机制 react 基于浏览器的事件机制自身实现了一套事件机制,称为合成事件。比如:onclick -> onClick 获取原生事件:e.nativeEvent onClick 并不会将事件代理函数绑定到真实的 DOM节点上,而是将所有的事件绑定到结构的最外层…

Pikachu-目录遍历

目录遍历,跟不安全文件上传下载有差不多; 访问 jarheads.php 、truman.php 都是通过 get 请求,往title 参数传参; 在后台,可以看到 jarheads.php 、truman.php所在目录: /var/www/html/vul/dir/soup 图片…

master节点k8s部署]33.ceph分布式存储(四)

总结ceph分布式存储(三)中提到的三种方法: 1.创建rbda,并且在创建pv的时候配置该rbda,以下代码仅展示关键信息。 [rootxianchaomaster1 ~]# cat pv.yaml apiVersion: v1 kind: PersistentVolume metadata: name: ceph-pv ...…

【每日一题 | 24.10.7】Fizz Buzz 经典问题

1. 题目2. 解题思路3. 代码实现(AC_Code) 个人主页:C_GUIQU 归属专栏:每日一题 1. 题目 Fizz Buzz 经典问题 2. 解题思路 【法1】逻辑硬解:按照题目逻辑分四种情况,用if else 判断即可。 【法2】switc…

Win10鼠标总是频繁自动失去焦点-非常有效-重启之后立竿见影

针对Win10鼠标频繁自动失去焦点的问题,可以尝试以下解决方案: 一、修改注册表(最有效的方法-重启之后立竿见影) 打开注册表编辑器: 按下WindowsR组合键,打开运行窗口。在运行窗口中输入“regedit”&#x…

VMware ESXi 7.0U3q macOS Unlocker OEM BIOS 2.7 Dell HPE 联想定制版 9 月更新发布

VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 Dell HPE 联想定制版 9 月更新发布 VMware ESXi 7.0U3q macOS Unlocker & OEM BIOS 2.7 标准版和厂商定制版 ESXi 7.0U3 标准版,Dell (戴尔)、HPE (慧与)、Lenovo (联想)、Inspur (浪潮)、Cisco (思科)…

探索二叉树的奇幻世界:解密二叉树的结构与遍历

文章目录 目录 一、二叉树的基本操作 1.1 获取树中节点的个数 1.2 获取叶子节点的个数 1.3 获取第K层节点的个数 1.4 获取二叉树的高度 二、二叉树相关习题 2.1 检查两颗树是否相同 2.2 另一颗树的子树 2.3 翻转二叉树 2.4 判断一颗二叉树是否是平衡二叉树 一、二…

封装el-upload组件,用于上传图片和视频

使用环境 vue3element-ui plus 需要根据后端返回结构修改的函数&#xff1a;onPreview onRemove onSuccess 组件使用 基本使用 源代码&#xff1a; <script setup> import AutoUploadFile from /components/auto-upload-file/index.vue function change(urls){console.…

Html批量转word工具2.1

2024年10月7日记录&#xff1a; 有客户反馈&#xff0c;2.0刚运行就提示转换完成 有问题就解决。正好国庆假期这几天有空&#xff0c;2.1版就出炉了。 2.1 更新记录&#xff1a; 修复了1个bug&#xff1a;刚运行就提示转换完成 下载地址&#xff1a;Html 转 word 批量处理工具…

一、Python(介绍、环境搭建)

一、介绍 Python 是一种高级编程语言&#xff0c;具有简洁易读的语法、丰富的库和强大的功能。Python是解释型语言&#xff0c;运行代码必须依赖安装好的解释器。Python目前存在两个版本&#xff1a;Python2、Python3&#xff08;主流使用&#xff09; 二、环境搭建 1.安装P…

智能家居有哪些产品?生活中常见的人工智能有哪些?

智能家居有哪些产品? 1、智能照明设备类&#xff1a;智能开关、智能插座、灯控模块、智能空开、智能灯、无线开关。 2、家庭安防类&#xff1a;智能门锁、智能摄像机、智能猫眼、智能门铃。 3、智能传感器类&#xff1a;烟雾传感器、可燃气体传感器、水浸传感器、声光报警器…

小程序-全局数据共享

目录 1.什么是全局数据共享 2. 小程序中的全局数据共享方案 MboX 1. 安装 MobX 相关的包 2. 创建 MobX 的 Store 实例 3. 将 Store 中的成员绑定到页面中 4. 在页面上使用 Store 中的成员 5. 将 Store 中的成员绑定到组件中 6. 在组件中使用 Store 中的成员 1.什么是全…

Python 语言学习——应用1.2 数字图像处理(第二节,变换)

目录 1.基础知识 1.图像几何变换概念 2.图像几何变换方式 3.插值运算 4.几何变换步骤 2.各类变换 1.位置变换 2.形状变换 3.代数运算 3.实战演练 1.基础知识 1.图像几何变换概念 在图像处理过程中&#xff0c;为了观测需要&#xff0c;常常需要对 图像进行几何变换&am…

Kali或Debian系统安装JDK1.8保姆级教程

一、下载JDK1.8 先到Oracle的官网下载JDK1.8 Java Archive | Oraclehttps://www.oracle.com/java/technologies/downloads/archive/Java Archive Downloads - Java SE 8

【springboot】整合沙箱支付

目录 1. 配置沙箱应用环境2. 配置springboot项目1. 引入依赖2. 配置文件注册下载ngrok 3. 创建支付宝支付服务类4. 支付界面模板5. 控制类实现支付6. 测试 1. 配置沙箱应用环境 使用支付宝账号登录到开放平台控制台。 使用支付宝登录后&#xff0c;看到以下页面&#xff0c;下…

云计算身份认证与访问控制(Cloud Computing Identity Authentication and Access Control)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…