Linux系统基础-多线程超详细讲解(1)

个人主页:C++忠实粉丝
欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 C++忠实粉丝 原创

Linux系统基础-多线程超详细讲解(1)

收录于专栏[Linux学习]
本专栏旨在分享学习Linux的一点学习笔记,欢迎大家在评论区交流讨论💌

目录

1. 线程的概念 

2. 线程的优缺点

线程的优点 : 

线程的缺点 : 

3. 线程用途

4. Linux进程VS线程 

进程和线程区分

进程和线程关系图解

5. 线程异常  


1. 线程的概念 

1. 在一个程序里面的一个执行路线就叫做线程 (thread). 更准确的定义是 : 线程是 "一个进程内部的控制序列"

2. 一切进程至少都有一个执行线程

3, 线程在进程内部运行, 本质是在进程地址空间内运行

4. 透过进程虚拟空间, 可以看到进程的大部分资源, 将进程资源合理分配给每个执行流, 就形成了线程执行流

总结 :

进程 = 内核数据结构 + 进程代码和数据 进程承担分配系统资源的基本实体!

线程 : 在进程内部运行, 是CPU调度的基本单位 

2. 线程的优缺点

线程的存在带来了一个问题 : 已经有多进程和进程池了, 为什么还需要多线程呢?

这就不得不谈一下线程的优缺点了:

线程的优点 : 

1. 创建一个新线程的代价要比创建一个新进程小的多! 

2. 相比于进程之间的切换相比, 线程之间的切换需要操作系统的工作要少很多

线程通常共享同一进程的内存空间,因此当线程切换时,许多数据和代码仍然在缓存中。这种共享提高了缓存的命中率,减少了从主内存读取数据的需要。

进程切换通常涉及更改整个进程的地址空间。当一个进程切换到另一个进程时,原有的缓存数据往往会被新的进程的缓存替换,这导致了缓存失效(cache misses)。这意味着需要更多的时间去重新加载所需的数据。

3. 线程占用的资源要比进程少很多

4. 能充分利用多处理器的可并行数量

5. 在等待慢速I/O操作结束的同时, 程序可执行其他的计算任务

6. 计算密集型应用, 为了能在多处理器系统上运行, 将计算分解到多个线程中实现

7. I/O密集型应用, 为了能提高性能, 将I/O操作重叠, 线程可以同时等待不同的I/O操作

线程的缺点 : 

1. 性能损失

一个很少被外部事件阻塞的计算密集型线程往往无法于同它线程共享一个处理器, 如果计算密集型线程的数量比可用的处理器多, 那么可能会有比较大的性能损失, 这里的性能损失是额外的同步和调度开销, 而可用资源不变

2. 健壮性降低

编写多线程需要更全面更深入的考虑, 在一个多线程程序里, 因时间分配上的细微偏差或者因共享了不该共享的变量而造成了不良影响的可能性是很大的, 换句话说, 线程之间是缺乏保护的

3. 缺乏访问控制

进程是访问控制的基本粒度, 在一个线程中调用某些OS函数会对整个进程造成影响.

4. 编程难度提高

编写与调试一个多线程程序比单线程程序困难的多

3. 线程用途

并发执行:

线程允许程序在同一进程中同时执行多个任务,提高程序的并发性和响应速度。例如,用户界面线程可以与后台处理线程并行工作,保持应用程序的响应性。

资源共享:

线程在同一进程中共享内存和资源,这使得数据共享更加高效。线程之间的通信和数据传递相比进程间通信(IPC)更简单,减少了数据复制和上下文切换的开销。

提高性能:

在多核处理器上,多个线程可以并行执行,从而充分利用多核的计算能力,提高应用程序的性能。例如,图像处理、数据分析等任务可以通过多线程加速处理。

异步操作:

线程可以用于实现异步操作,使得程序在等待某些耗时操作(如I/O操作、网络请求)时不会阻塞主执行流。例如,网络下载可以在一个线程中进行,主线程仍然可以处理用户输入。

后台处理:

线程适合执行需要长时间处理的任务,而不影响主程序的性能。例如,定期执行的任务(如日志记录、数据备份)可以在后台线程中运行。

简化设计:

在某些应用中,使用线程可以使程序设计更为简单清晰。比如,使用线程池可以管理多个任务并减少资源的管理复杂性。

游戏和图形处理:

在游戏开发中,多个线程可用于处理物理运算、图形渲染和AI计算,使游戏更加流畅和高效。

服务器应用:

在服务器应用中,线程可以用于处理多个并发请求,例如Web服务器通常会为每个请求创建一个线程,以提高处理能力和响应速度。

4. Linux进程VS线程 

进程和线程区分

进程是资源分配的基本单位

线程是调度的基本单位

线程共享进程数据, 但也拥有自己的一部分数据:

线程ID

一组寄存器

error

信号屏蔽字

调度优先级

进程的多个线程共享同一地址空间, 因此Text Segment, Data Segment都是共享的, 如果定义一个函数, 在各个线程中都可以调用, 如果定义一个全局变量在各个线程总都可以访问, 除此之外, 各线程还共享以下进程资源和环境:
1. 文件描述符表

2. 每种信号的处理方式

3. 当前工作目录

4. 用户id和组id 

进程和线程关系图解

进程和线程关系如下图所示:

 

5. 线程异常  

单个线程如果出现除零, 野指针问题导致线程崩溃, 进程也会随着崩溃

线程是进程的执行分支, 线程出现异常, 就类似进程出异常, 进而触发信号机制, 终止进程, 进程终止, 该进程内的所有线程也就随之退出

代码示例:

#include <iostream>
#include <unistd.h>
#include <ctime>int gval = 100;void *threadStart(void *args)
{while(true){sleep(1);int x = rand() % 5;std::cout << "new thread running..." << "pid: " << getpid() << ", gval: " << gval << ", &gal: " << &gval << std::endl;if(x == 0){int *p = nullptr;*p = 100;//野指针}}
} int main()
{srand(time(nullptr));pthread_t tid1;pthread_create(&tid1, nullptr, threadStart, (void *)"thread-new");pthread_t tid2;pthread_create(&tid2, nullptr, threadStart, (void *)"thread-new");pthread_t tid3;pthread_create(&tid3, nullptr, threadStart, (void *)"thread-new");pthread_t tid4;pthread_create(&tid4, nullptr, threadStart, (void *)"thread-new");//主线程while(true){std::cout << "main thread running..." << ", pid: " << getpid() << ", gval: " << gval << ", &gval: " << &gval << std::endl;gval++;sleep(1);}
}


 

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

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

相关文章

QGIS提取面的顶点坐标到属性表

相关参考&#xff1a;QGIS中提取面的中心坐标到属性表-CSDN博客 polygon_layer QgsProject.instance().mapLayersByName("Polygon")[0]polygon_layer.startEditing() polygon_layer.dataProvider().addAttributes([QgsField("coors", QVariant.String, le…

面向对象编程中类与类之间的关系(二)

目录 1.引言 2.泛化&#xff08;继承&#xff09;关系 3.实现关系 4.聚合关系 5.组合关系 6.依赖关系 7.关联关系 7.1. 单向关联 7.2. 双向关联 7.3.自关联 8.总结 1.引言 在面向对象设计模式中&#xff0c;类与类之间主要有6种关系&#xff0c;他们分别是&#xff…

Android Studio安装完成后,下载gradle-7.4-bin.zip出现连接超时

文章目录 问题原因&#xff1a;因为下载镜像是谷歌&#xff0c;属于外网&#xff0c;不好正常连接&#xff0c;下载依赖。解决方法&#xff1a;找到gradle-wrapper.properties文件&#xff0c;修改镜像&#xff0c;如下图&#xff0c;然后再单击try again重新下载。 问题原因&a…

[论文阅读]Constrained Decision Transformer for Offline Safe Reinforcement Learning

Constrained Decision Transformer for Offline Safe Reinforcement Learning Proceedings of the 40th International Conference on Machine Learning (ICML), July 23-29, 2023 https://arxiv.org/abs/2302.07351 泛读只需要了解其核心思想即可。 安全强化学习(Safe Rei…

解决 IntelliJ IDEA 中使用 Lombok 编译报错的几种方法

目录 引言 常见的 Lombok 编译错误 解决方法 方法一&#xff1a;确保最新版本 Lombok 库已添加到项目依赖 方法二&#xff1a;检查 IDEA 的编译器设置 方法三&#xff1a;安装并启用 Lombok 插件 方法四&#xff1a;配置 Lombok 注解处理器 方法五&#xff1a;检查 Lom…

基于熵权法的TOPSIS模型

基于熵权法的TOPSIS模型 1. 简介 数学建模可以结合 熵权法 和 T O P S I S TOPSIS TOPSIS 法各自的特点&#xff0c;进行评价&#xff0c;这种组合模型的使用在数学建模比赛中使用的非常多。 在 2023 美赛 O 奖中就有使用该方法的&#xff0c;往年国赛国奖中也有 2. 熵权法介…

js基础入门篇

1.输出语句&#xff0c;内部样式&#xff0c;外部样式&#xff0c;数组定义 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.…

EV代码签名证书是什么?作用有哪些?如何获取呢?

我们都知道&#xff0c;黑客们往往会通过篡改软件代码来进行各种恶意行为&#xff0c;例如加入病毒、木马、恶意代码等&#xff0c;为了确保软件代码的完整性和可信任性&#xff0c;代码签名证书诞生了。代码签名证书又分为普通代码签名证书和EV代码签名证书&#xff0c;今天我…

python原地去重实战案例笔记

数据样例&#xff1a;&#x1f447; 最终想要的结果&#xff1a; 一、解决办法 思路&#xff1a;处理逐个元素检查是否已经出现过&#xff0c;重复的元素用空字符串替换。 # 原始数据 data [[数据1, 数据2, 数据3, 数据4, 数据5],[D, A, S, Q, J],[Y, L, D, J, O],[G, X, X,…

给哔哩哔哩bilibili电脑版做个手机遥控器

前言 bilibili电脑版可以在电脑屏幕上观看bilibili视频。然而&#xff0c;电脑版的bilibili不能通过手机控制视频翻页和调节音量&#xff0c;这意味着观看视频时需要一直坐在电脑旁边。那么&#xff0c;有没有办法制作一个手机遥控器来控制bilibili电脑版呢&#xff1f; 首先…

如何在macOS开发中给 PKG 签名和公证(productsign+notarytool)

在macOS中&#xff0c;给PKG文件进行签名是一个确保用户能够顺利无警告地安装软件的重要步骤。以下是给PKG签名的详细步骤&#xff1a; 一、准备阶段 获取开发者账号和证书&#xff1a; 首先&#xff0c;需要在苹果开发者网站&#xff08;Apple Developer&#xff09;注册一个…

Linux系统下minio设置SSL证书进行HTTPS远程连接访问

文章目录 1.配置SSL证书使用HTTPS访问2.MINIO SDK 忽略证书验证3.使用受信任的证书 1.配置SSL证书使用HTTPS访问 生成域名对应的SSL证书&#xff0c;下载Apache版本&#xff0c;我目前只发现Apache这个里面有对应的私钥和证书 私钥重命名为private.key证书重命名为public.crt&…

AtCoder ABC376A-D题解

个人觉得 ABC 变得越来越难了/kk/kk/kk 比赛链接:ABC376 Problem A: Code #include <bits/stdc.h> using namespace std; int main(){int N,C;cin>>N>>C;for(int i1;i<N;i)cin>>T[i];int ans0,pre-1e5;for(int i1;i<N;i){if(T[i]-pre>C){…

Java:String类(超详解!)

一.常用方法 &#x1f94f;1.字符串构造 字符串构造有三种方法&#xff1a; &#x1f4cc;注意&#xff1a; 1. String是引用类型&#xff0c;内部并不存储字符串本身 如果String是一个引用那么s1和s3应该指向同一个内容&#xff0c;s1和s2是相等的&#xff0c;应该输出两…

使用Django框架开发企业级Web应用

&#x1f496; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4bb; Gitee主页&#xff1a;瑕疵的gitee主页 &#x1f680; 文章专栏&#xff1a;《热点资讯》 使用Django框架开发企业级Web应用 1 引言 2 Django简介 3 安装Python与Django 4 创建Django项目 5 设计应用结构 6 创…

行业首发|美格智能创新推出5G+Wi-Fi 7智能终端解决方案,端侧AI助力数智升维

在数字化时代的生产生活过程中&#xff0c;特殊场景下的通信需求愈发重要。高速、灵活、稳定的通信保障能够进一步提升生产生活的效率。随着5G网络的高速发展&#xff0c;一方面&#xff0c;其凭借低时延、高带宽、高可靠性和大规模连接的特性让移动终端的网络连接实现跨越式升…

UML总结

零&#xff1a;学习链接 UML_哔哩哔哩_bilibili 一&#xff1a;UML概述 二&#xff1a;类图 类图&#xff08;Class Diagram&#xff09;是统一建模语言&#xff08;UML&#xff09;中一种重要的图形表示&#xff0c;用于描述系统中的类及其之间的关系。它是面向对象设计中常…

基于SSM+微信小程序考试的管理系统(考试1)

&#x1f449;文末查看项目功能视频演示获取源码sql脚本视频导入教程视频 1、项目介绍 基于SSM微信小程序考试的管理系统实现了管理员及用户。 1、管理员功能有个人中心&#xff0c;用户管理&#xff0c;考试资料管理&#xff0c;用户交流管理&#xff0c;试卷管理&#xff…

大数据日志处理框架ELK方案

介绍应用场景大数据ELK日志框架安装部署 一&#xff0c;介绍 大数据日志处理框架ELK&#xff08;Elasticsearch、Logstash、Kibana&#xff09;是一套完整的日志集中处理方案&#xff0c;以下是对其的详细介绍&#xff1a; 一、Elasticsearch&#xff08;ES&#xff09; 基本…

ZEISS ATOS Q蓝光三维扫描仪高效把控零件质量检测【上海沪敖3D】

位于Bengaluru的施耐德电气工厂拥有一流的计量设备&#xff0c;可以检测所有供应商的零件。当时&#xff0c;他们在使用一款激光扫描设备进行质量检测&#xff0c;但是&#xff0c;该设备不便于携带&#xff0c;且检测时需要喷涂大量的显影液。此外&#xff0c;它需要被安装在夹…