Linux系统编程 | 线程的基本概念

💓个人主页:mooridy
💓专栏地址:Linux
关注我🌹,和我一起学习更多计算机的知识!

🔝🔝🔝

什么是线程

程序中的一个执行路线就叫做线程

  • 一个进程至少要有一个执行线程,单个进程本身就是一个执行流,所以单个进程某种意义上也是一个线程(是主线程).线程在进程内部运行,本质是在进程地址空间内运行
  • 在Linux操作系统下,线程就是轻量化进程,线程是没有独立的地址空间的PCN结构,线程的资源是主线程共享给它们的。
    ![[Pasted image 20250325104542.png]]

线程的优点

• 线程的创建时间比进程快
因为进程在创建的过程中,还需要资源管理信息,比如内存管理信息、文件管理信息,而线程在创建的过程中,不会涉及这些资源管理信息,而是共享它们;

• 同一个进程内的线程切换比进程切换快
因为线程具有相同的地址空间(虚拟内存共享),这意味着同一个进程的线程都具有同一个页表,同一个虚拟地址空间,那么在切换的时候不需要切换页表。同时也不会扰乱处理器的缓存机制。
• 线程之间的数据交互效率更高
由于同一进程的各线程间共享内存和文件资源,那么在线程之间数据传递的时候,就不需要经过内核了;

线程异常

线程是进程的执⾏分⽀,线程出异常,就类似进程出异常,进⽽触发信号机制,会终⽌整个进程,该进程内的所有线程也就随即退出。

线程与进程的比较

进程资源分配的单位,线程CPU 调度的单位;
• 进程拥有一个完整的资源平台,而线程只独享必不可少的资源,如寄存器和栈、线程ID、信号屏蔽字、调度优先级

进程的多个线程共享

同⼀地址空间,因此Text SegmentData Segment都是共享的,如果定义⼀个函数,在各线程中都可以调⽤,如果定义⼀个全局变量,在各线程中都可以访问到,除此之外,各线程还共享以下进程资源和环境:
⽂件描述符表、每种信号的处理⽅式(SIG_ IGN、SIG_ DFL或者⾃定义的信号处理函数)、当前⼯作⽬录、用户id和组id

主线程的PID和LWP相同,CPU调度时是在看LWP,而不是PID,线程的PID和主线程相同,自己独有LWP

Linux线程控制

POSIX线程库

由于pthred是第三方库
所以编译时要加上-lpthread的字段

如何创建线程
功能:创建⼀个新的线程原型:int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void*), void *arg);参数:thread:返回线程IDattr:设置线程的属性,attr为NULL表⽰使⽤默认属性start_routine:是个函数地址,线程启动后要执⾏的函数arg:传给线程启动函数的参数返回值:成功返回0;失败返回错误码
如何终止线程
  1. 从线程函数return。这种⽅法对主线程不适⽤,从main函数return相当于调⽤exit。(大多数情况)

  2. 线程可以调⽤pthread_ exit终⽌⾃⼰。

功能:线程终⽌
原型:void pthread_exit(void *value_ptr);参数:value_ptr: 指向退出状态的指针,可传递任意类型数据value_ptr不要指向⼀个局部变量。
返回值:⽆返回值,跟进程⼀样,线程结束的时候⽆法返回到它的调⽤者(⾃⾝)
  1. ⼀个线程可以调⽤pthread_ cancel终⽌同⼀进程中的另⼀个线程。
功能:取消⼀个执⾏中的线程原型:int pthread_cancel(pthread_t thread);参数:thread:线程ID返回值:成功返回0;失败返回错误码
如何进行线程等待
功能:等待线程结束原型int pthread_join(pthread_t thread, void **value_ptr);参数:thread:线程IDvalue_ptr:它指向⼀个指针,后者指向线程的返回值返回值:成功返回0;失败返回错误码

假如不进行线程等待,可能会出现类似于僵尸进程的问题

调⽤该函数的线程将挂起等待,直到id为thread的线程终⽌。

如何进行线程分离
  • 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进⾏pthread_join操作,否则⽆法释放资源,从⽽造成系统泄漏。
  • 如果不关⼼线程的返回值,join是⼀种负担,这个时候,我们可以告诉系统,当线程退出时,⾃动释放线程资源。
int pthread_detach(pthread_t thread);

pthread_self()函数可以返回当前线程的线程ID,所以假设我们想要当前线程与主线程脱离关系,可以这样写: ```

pthread_detach(pthread_self());

线程ID本质

首先,pthread_create的返回值是线程ID.
线程ID的本质是一个地址,pthread库是一个动态库,是第三方库,这个库会被映射到进程的地址空间的共享区中,而线程ID所指的地址则是pthread这个库层面上,线程集合的起始地址
![[Pasted image 20250327113215.png]]

线程栈
  • 这种stack不能动态增⻓,⼀旦⽤尽就没了,这是和⽣成进程的fork不同的地⽅。
  • 对于⼦线程的 stack ,它其实是在进程的地址空间中map出来的⼀块内存区域,原则上是线程私有的,但是同⼀个进程的所有线程⽣成的时候,是会浅拷⻉⽣成者的 task_struct 的很多字段,如果愿意,其它线程也还是可以访问到的,于是⼀定要注意。

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

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

相关文章

小林coding-12道Spring面试题

1.说一下你对 Spring 的理解?spring的核心思想说说你的理解? 2.Spring IoC和AOP 介绍一下?Spring的aop介绍一下?IOC和AOP是通过什么机制来实现的?怎么理解SpringIoc?依赖倒置,依赖注入,控制反转分别是什么?依赖注…

第十二章——位运算

按位的与& 若x的第i位和y的第i位都是1,那么(x&y)1,否则(x&y) 0 应用:希望让某一位或某些位为0 。取一个数中的一段。 按位的或| 若x的第i位1或y的第i位1,那么&…

计算机等级考试数据库三级(笔记3)

插入 修改 现要创建一个具有如下功能的触发器:每当在销售表中插入一条销售记录时,修改商品表中对应商品的销售总量,假设一次只插入一条销售记录。请补全下列代码。CREATE TRIGGER tri insert on xx FOR xx AS xx 商品表 xx 销售总量xx (SELEC…

【Leetcode 每日一题】2716. 最小化字符串长度

问题背景 给你一个下标从 0 0 0 开始的字符串 s s s,重复执行下述操作 任意 次: 在字符串中选出一个下标 i i i,并使 c c c 为字符串下标 i i i 处的字符。并在 i i i 左侧(如果有)和 右侧(如果有&…

Flutter中实现拍照识题的功能

文章目录 **1. 功能拆解****2. 具体实现步骤****(1) 拍照或选择图片****(2) 图片预处理(可选)****(3) 文字识别(OCR)****(4) 数学公式识别 → LaTeX****方案1:Mathpix API(高精度,付费&#xff…

【Mysql:内置函数】

日期函数: 查看当前日期: select current_date();查看当前时间: select current_time(); 查看当前时间戳: select current_timestamp(); 计算两个日期的差值: select datediff(date1,date2); 当前的日期时间&a…

71. 我的第一个Linux驱动实验

一、字符设备驱动框架 字符设备驱动的编写主要就是驱动对应的open、close、read。。。其实就是 file_operations结构体的成员变量的实现。 其中关于 C 库以及如何通过系统调用“陷入” 到内核空间这个我们不用去管,我们重点关注的是应用程序和具体的驱动&#xff0…

jdk21使用Vosk实现语音文字转换,免费的语音识别

1.下载vosk的model vosk官网&#xff1a;https://alphacephei.com/vosk/models 我这里使用较小的vosk-model-small-cn-0.22 2.添加相关pom文件 <!-- 获取音频信息 --><dependency><groupId>org</groupId><artifactId>jaudiotagger</artifac…

如何一键安装所有Python项目的依赖!

在开发项目时&#xff0c;常常需要在多个环境中安装各种依赖。对开发者来说&#xff0c;每次手动一个个安装这些依赖是不是很麻烦&#xff1f;&#x1f605; 其实有个超简单的办法&#xff01;只需要一个脚本&#xff0c;就能快速解决问题&#xff01;&#x1f4a1; 这就是我们…

Blender配置渲染设置并输出动画

在Blender中&#xff0c;渲染设置和渲染动画的选项位于不同的面板中。以下是具体步骤&#xff1a; 渲染设置 渲染设置用于配置输出格式、分辨率、帧率等参数。 打开右侧的 属性面板&#xff08;按 N 键可切换显示&#xff09;。 点击 “输出属性” 选项卡&#xff08;图标是…

C++修炼:string类的使用

Hello大家好&#xff01;很高兴我们又见面啦&#xff01;给生活添点passion&#xff0c;开始今天的编程之路&#xff01; 我的博客&#xff1a;<但凡. 我的专栏&#xff1a;《编程之路》、《数据结构与算法之美》、《题海拾贝》、《C修炼之路》 欢迎点赞&#xff0c;关注&am…

【go微服务】如何快速掌握grpc开发

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

【区块链 + 文化版权】基于 FISCO BCOS 的方言大数据语料库 | FISCO BCOS 应用案例

苏州喵自在区块链科技有限公司打造的基于FISCO BCOS 的粤语大数据语料库&#xff0c; 旨在利用区块链技术保护和发展粤语文化遗产。该项目利用区块链的不可篡改性、分布式存储、智能合约和激励机制等特性&#xff0c; 为保护非物质文化遗产&#xff0c; 加强粤语研究与教育和开…

大模型在支气管扩张预测及治疗方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与方法 1.3 国内外研究现状 二、大模型技术概述 2.1 大模型的基本原理与架构 2.2 适用于支气管扩张预测的大模型类型及特点 2.3 大模型在医疗领域的应用现状与优势 三、支气管扩张的相关医学知识 3.1 支气管扩张的病因…

亚马逊云科技提供完全托管的DeepSeek-R1模型

近日&#xff0c;亚马逊云科技宣布在Amazon Bedrock上线完全托管的DeepSeek-R1模型。DeepSeek是首个登陆Amazon Bedrock的国产大模型&#xff0c;自今年1月底推出以来&#xff0c;已有数千客户使用Amazon Bedrock的自定义模型导入功能部署了DeepSeek-R1模型。 DeepSeek在过去几…

二叉树、排序算法与结构图

二叉树、排序算法与数据库 二叉树 二叉树的性质 节点数与深度的关系&#xff1a;深度为 k k k的二叉树&#xff0c;最多有 2 k − 1 2^k - 1 2k−1个节点。例如&#xff0c;深度为 3 3 3的二叉树&#xff0c;最多有 2 3 − 1 7 2^3 - 1 7 23−17个节点。叶子节点与度为2节…

vmwaretools解压失败|vmware tools distrib cannot mkdir read only file system|bug汇总

最简单的一条路线&#xff1a;你的解压命令用sudo了吗&#xff1f; 这个方法不能解决的话就看下面内容。本文提供给你全过程思路。 如需转载&#xff0c;标记出处 背景&#xff1a; 之前虚拟机和主机的复制黏贴还能用&#xff0c;今天突然用不了&#xff0c;重新下载安装包&am…

jEasyUI 创建自定义视图

jEasyUI 创建自定义视图 引言 jEasyUI 是一款流行的 jQuery UI 组件库&#xff0c;它提供了丰富的 UI 组件和交互效果&#xff0c;极大地简化了 Web 开发的复杂度。在 jEasyUI 中&#xff0c;我们可以通过自定义视图来扩展其功能&#xff0c;满足特定的业务需求。本文将详细介…

Spring MVC配置详解:从历史到实战

文章目录 一、Java Web的发展历程1.Model I与Model II开发模式&#xff08;1&#xff09; Model I开发模式&#xff08;2&#xff09;Model II开发模式 2.MVC设计模式Spring MVC本质MVC工作流程 二、Spring MVC快速入门实战1.环境搭建步骤&#xff08;1&#xff09;创建Maven W…

老是忘记package.json,备忘一下 webpack 环境下 Vue Cli 和 Vite 命令行工具对比

Vue 2.X webpack 环境下 Vue Cli 的命令 "scripts": {"dev": "vue-cli-service serve","prod": "vue-cli-service serve --mode production","build:dev": "vue-cli-service build --mode development"…