【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.xdnf.cn/news/1557297.html

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

相关文章

_c++11

嗨喽大家好呀,今天阿鑫给大家带来的是c进阶——c11的内容,好久不见啦,下面让我们进入本节博客的内容吧! _c11 统一的列表初始化右值引用可变模板参数(了解,不常接触)lambda表达式function和bind包装器 1. 统一的列表…

气膜体育馆:解决场地困境的新选择—轻空间

北京市近日出台了关于规范和加强新建充气膜体育建筑的指导意见,旨在有效解决区域体育配套不足的问题。这一政策的出台,不仅为全民健身打造了新的载体,也为校园体育设施建设指明了方向。 满足日益增长的健身需求 随着人们健康意识的提升&#…

Skyeye 云智能制造 v3.14.8 发布,ERP 商城 + AI

Skyeye 云智能制造,采用 Springboot winUI 的低代码平台、移动端采用 UNI-APP。包含 30 多个应用模块、50 多种电子流程,CRM、PM、ERP、MES、ADM、EHR、笔记、知识库、项目、门店、商城、财务、多班次考勤、薪资、招聘、云售后、论坛、公告、问卷、报表…

openmmlab使用系列(二):图像超分辨率重构

文章目录 前言一、图像超分辨率重构简介二、mmmagic实现图像超分 前言 超分辨率重构技术,作为计算机视觉领域的一项重要研究课题,近年来受到了广泛关注。随着科技的飞速发展,人们对图像质量的要求越来越高,尤其是在智能手机、监控…

SpringBoot3实战:实现接口签名验证

有时候我们要把自己的服务暴露给第三方去调用,为了防止接口不被授权访问,我们一般采用接口签名的方式去保护接口。 接下来松哥和大家聊一聊这个话题。 一 场景分析 什么时候需要接口签名? 接口签名是一种重要的安全机制,用于确…

JAVA基础: synchronized 和 lock的区别、synchronized锁机制与升级

1 synchronized 和 lock的区别 synchronized是一个关键字, lock是一个接口,实际使用的是实现类 synchronized通过触发的是系统级别的锁机制, lock是API级别的锁机制 synchronized自动获得锁,自动释放锁。 lock需要通过方法获得锁…

[oeasy]python036_数据类型有什么用_type_类型_int_str_查看帮助

回忆上次内容 ord(c)和chr(i) 这是俩函数 这俩函数是一对 相反相成的⚖️ ord 通过 字符 找到对应的 序号chr 通过 序号 找到对应的 字符 为什么ord后面括弧里的参数 一定 要加引号不加不行 而chr后面括弧里的参数 又一定 不加引号加了不行呢?🤔 TypeErr…

强基计划与少儿编程有什么关系?

近年来,编程教育逐渐在基础教育中崭露头角,成为培养孩子逻辑思维、创新能力和解决问题能力的重要手段。而2020年推出的强基计划则是一项面向高考生的特殊招生计划,旨在为基础学科(如数学、物理、化学、生物、历史、哲学等&#xf…

MySQL 删除数据库

使用 mysqladmin 删除数据库 使用普通用户登陆MySQL服务器,你可能需要特定的权限来创建或者删除 MySQL 数据库。 所以我们这边使用root用户登录,root用户拥有最高权限,可以使用 MySQL mysqladmin 命令来删除数据库。 在删除数据库过程中&a…

双向数据库迁移工具:轻松实现 MySQL 与 SQLite 数据互导

项目概述与作用 该项目的核心是实现 MySQL 和 SQLite 两种数据库之间的数据迁移工具。它能够轻松地将 MySQL 数据库中的数据导出为 SQLite 数据库文件,反过来也可以将 SQLite 数据库中的数据上传到 MySQL 数据库中。这个双向迁移工具非常适用于: 数据库备…

51c自动驾驶~合集2

我自己的原文哦~ https://blog.51cto.com/whaosoft/11491137 #BEVWorld BEV潜在空间构建多模态世界模型,全面理解自动驾驶~一、引言 世界模型建模了有关环境的知识,其可以通过给定的条件对未来进行合理的想象。未来想象要求世界模型具有物理规律的理解…

利用 OpenAI 和 Python 预测股市行情

作者:老余捞鱼 原创不易,转载请标明出处及原作者。 写在前面的话: 本文介绍了如何利用 OpenAI 和 Python 进行股市情绪预测。主要通过使用 EODHD 提供的股市和金融新闻 API 来提取新闻数据,并利用 LangChain 和 OpenAI 的大型语言模型进行情感分析。 一、综述 …

如何在电脑上启动两个微信实例

前言 有时候,我们需要在电脑端登陆两个微信,来处理不同的事情,之前快速双击微信图标即可打开多个微信,最近发现不是太好使,所以今天介绍一种使用window命令启动两个微信的方法。 步骤 1、找到微信的安装目录&#x…

js逆向--某招标公告公示搜索引擎DES解密

js逆向--某招标公告公示搜索引擎DES解密 一、寻找数据接口二、寻找解密入口三、编写代码一、寻找数据接口 打开网页,在搜索框中输入关键词python。 试图通过按F12或者右键打开开发者工具,发现均没有反应。这时需要点击浏览器右上角的三个点,然后点击更多工具–开发者工具,…

增强分析:新时代的数据洞察工具

随着数据科学和人工智能的迅猛发展,分析数据的方式也发生了显著的变化。增强分析(Augmented Analytics)是近年来涌现出的新概念,它将人工智能(AI)、机器学习(ML)和自然语言处理&…

华为OD机试 - 实力差距最小总和(Java 2024 E卷 200分)

华为OD机试 2024E卷题库疯狂收录中,刷题点这里 专栏导读 本专栏收录于《华为OD机试(JAVA)真题(E卷D卷A卷B卷C卷)》。 刷的越多,抽中的概率越大,私信哪吒,备注华为OD,加…

SpringBoot 集成 Redis

一:SpringBoot 集成 Redis ①Redis是一个 NoSQL(not only)数据库, 常作用缓存 Cache 使用。 ②Redis是一个中间件、是一个独立的服务器;常用的数据类型: string , hash ,set ,zset , list ③通过Redis客…

【2024年持续更新】国内ChatGPT-4中文镜像网站整理

目录 一、什么是ChatGPT镜像站? 二、GPT工具跟国内AI大模型整理 三、国内大模型与ChatGPT的区别 四、ChatGPT能做什么? 五、ChatGPT提示词教学 一、什么是ChatGPT镜像站? 镜像网站是指将原始网站的内容复制并放置在另一服务器上的网站。…

在 Hugging Face MTEB 排行榜上比较 ELSER 的检索相关性

作者:来自 Elastic Aris Papadopoulos 及 Serena Chou 本博客对 ELSER 在 Hugging Face MTEB 排行榜上的检索相关性进行了比较。 在 Hugging Face MTEB 排行榜上比较 ELSER 的检索相关性 ELSER(Elastic Learned Sparse EncodeR)是 Elastic …

Linux TFTP服务器搭建

话得多说 先水一波字 TFTP(Trivial File Transfer Protocol)是一种简单的文件传输协议。它用于在计算机网络中传输文件,特别适用于在网络设备(如开发板和Linux系统下)代码调试等操作。TFTP使用UDP(User Da…