linux——线程

线程概念

什么是线程?

  • 在一个程序里的一个执行流叫做线程。
  • 一切进程至少有一个线程
  • 线程在进程内部运行,本质是在进程地址空间内运行
  • 在Linux系统中,在CPU眼中,看到的PCB都要比传统的进程更加轻量化

在这里插入图片描述
我们都知道在每一个进程都有属于自己的PCB,里面装满了
描述进程的各种字段…,而线程呢,是在进程中产生的,所以会共享共一个进程地址空间,如上图所示。

线程的优点

  • 创建一个新线程的代价要比创建一个新进程小
  • 与进程之间的切换相比,线程之间的切换需要操作系统做的工作要小很多
  • 线程占比的资源比进程小很多、
  • 能充分利用多处理器的可并行数量
  • 在等待慢速I/O操作结束的同时,程序可执行其他的计算任务

线程的缺点

  • 性能的损失
    • 一个很少被外部事件阻塞的计算密集型线程往往无法与共它线程共享同一个处理器。如果计算密集型线程的数量比可用的处理器多,那么可能会有较大的性能损失,这里的性能损失指的是增加了额外的
      同步和调度开销,而可用的资源不变。
  • 健壮性差: 编写多线程的时候,很多时候线程是不安全的

进程和线程的差别

  • 进程是资源分配的基本单位,站在内核的角度来讲,进程就是承担分配系统资源的基本实体
  • 线程是调度的基本单位
  • 线程共享进程数据,但也有自己的一部分数据
    • 线程ID
    • 一组寄存器:保存属于自己的上下文
    • 栈(这很重要)
    • errno
    • 信号屏蔽字等等

以下我将聊一聊POSIX线程库

  • 与线程相关的函数构成了一个完整的系列,绝大多都是“pthread_”打头
  • 所以要用这些函数需要引用<pthraed.h>头文件
  • 链接的时候需要加上-lpthread

在我们链接线程库的时候,我们需要将线程库给加载进自己的地址空间中(共享区),然后当我们需要什么函数的时候,直接去共享区去取。

创建线程

在这里插入图片描述

第一个参数(thread):线程的ID
第二个参数(attr):线程的属性
第三个参数(start_routine):是个函数地址,线程启动的时候执行的函数
第四个参数(arg):传给线程启动函数的参数
返回值:失败返回0,否则返回错误码,错误码被设置了

关于线程ID

其实真实的线程ID是下图所示
在这里插入图片描述

pthread_t是什么类型呢? 我们可以理解为是进程地址空间的一个地址。
前面讲过,当程序运行的时候,会将线程库给放进共享区中,所以这个线程ID就是共享区中的一个地址。 而这个地址其实就是线程控制块的地址,里面存放着线程独有的数据
在这里插入图片描述

在这里插入图片描述
你看PID一样,但是LWP是不一样的,这样证明了我上述的结论。

5 void* routine(void *args)6 {7     int i;8     for(;;)9     {10         std::cout << "I am thread" <<std::endl;11         sleep(1);12     }13 }14 15 int main()16 {17     pthread_t tid;18     int ret;19     if(ret == pthread_create(&tid,nullptr,&routine,nullptr) != 0)20     {21         std::cout << "pthread_create err" << std::endl;22         exit(-1);23     }24 25     int i;26     for(;;)27     {28         std::cout << "I am main thread" <<std::endl;29         sleep(1);                                                                                                                                                    30     }31 32     return 0;33 }

线程退出

在这里插入图片描述
参数 value_ptr:value_ptr不要指向一个局部变量。返回值:无返回值,跟进程一样,线程结束的时候无法返回到它的调用者(自身)

线程等待

在这里插入图片描述
参数 thread:线程ID value_ptr:它指向一个指针,后者指向线程的返回值返回值:成功返回0;失败返回错误码

调用该函数的线程将挂起等待,直到id为thread的线程终止。thread线程以不同的方法终止,通过pthread_join得到的终止状态是不同的,总结如下:

  1. 如果thread线程通过return返回,value_ ptr所指向的单元里存放的是thread线程函数的返回值。
  2. . 如果thread线程被别的线程调用pthread_ cancel异常终掉,value_ ptr所指向的单元里存放的是常数PTHREAD_ CANCELED。
  3. 如果thread线程是自己调用pthread_exit终止的,value_ptr所指向的单元存放的是传给pthread_exit的参数。
  4. 如果对thread线程的终止状态不感兴趣,可以传NULL给value_ ptr参数。

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

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

相关文章

4层负载均衡和7层负载均衡

四层负载均衡&#xff08;Layer 4 Load Balancing&#xff09;指的是在网络传输层&#xff08;TCP/IP模型中的第四层&#xff09;进行负载均衡的技术。四层负载均衡通常使用IP地址、端口号和协议等信息来将网络流量分配到多个服务器上。它主要关心网络层的信息&#xff0c;不涉…

Ubuntu 22.04.4 LTS (linux) Auditd 安全审计rm命令 记录操作

1 audit增加rm 规则 #sudo vim /etc/audit/rules.d/audit.rules -w /bin/rm -p x -k delfile #重新启动服务 sudo systemctl restart auditd #查看规则 sudo auditctl -l -w /bin/rm -p x -k delfile 2 测试规则 touch test.txt rm test.tx 3 查看日志 sudo ausear…

Apache-Flink未授权访问高危漏洞修复

漏洞等级 高危漏洞!!! 一、漏洞描述 攻击者没有获取到登录权限或未授权的情况下,或者不需要输入密码,即可通过直接输入网站控制台主页面地址,或者不允许查看的链接便可进行访问,同时进行操作。 二、修复建议 根据业务/系统具体情况,结合如下建议做出具体选择: 配…

无人机之遥控器分类篇

一、传统遥控器 传统无人机遥控器一般包括开关键、遥控天线等基础装置。但是会随着无人机具体的应用和功能而开发不同的按键。它的信号稳定性远超对比其他遥控&#xff0c;而且遥控距离也更远&#xff08;一般遥控范围在100米或以上&#xff09;传统遥控器对于初学者来说比较难…

在uniapp中如何使用地图

1&#xff0c;技术选择 最好是使用webview html形式加载&#xff0c;避免打包app时的地图加载问题 2&#xff0c;webview使用 使用webview必须按照官方文档,官网地址&#xff1a;https://uniapp.dcloud.net.cn/component/web-view.html <template><view><!…

KNN分类算法与鸢尾花分类任务

鸢尾花分类任务 1. 鸢尾花分类步骤1.1 分析问题&#xff0c;搞定输入和输出1.2 每个类别各采集50朵花1.3 选择一种算法&#xff0c;完成输入到输出的映射1.4 第四步&#xff1a;部署&#xff0c;集成 2. KNN算法原理2.1 基本概念2.2 核心理念2.3 训练2.4 推理流程 3. 使用 skle…

ubuntu安装k8s+docker运行英伟达gpu cuda

安装k8sdocker sealos resetsealos run registry.cn-shanghai.aliyuncs.com/labring/kubernetes-docker:v1.27.7 registry.cn-shanghai.aliyuncs.com/labring/helm:v3.9.4 registry.cn-shanghai.aliyuncs.com/labring/cilium:v1.13.4 --single 英伟达Ubuntu驱动下载地址&…

android 混淆后报如错 java.lang.ClassCastException

android 升级 gradle 混淆后报如错 java.lang.ClassCastException Caused by: java.lang.ClassCastExceptionat androidx.appcompat.app.ToolbarActionBar$$ExternalSyntheticThrowCCEIfNotNull0.m(:0) 原因&#xff1a; retrofit 混淆问题 解决&#xff1a; 将如下加入混淆…

java设计模式(二十)迭代器模式(Iterator Pattern)

1、模式介绍&#xff1a; 迭代器模式是一种行为设计模式&#xff0c;它允许客户端通过统一的方式访问聚合对象中的各个元素&#xff0c;而不必暴露其内部表示。通过迭代器模式&#xff0c;可以在不知道聚合对象内部结构的情况下&#xff0c;顺序访问其中的元素。 2、应用场景…

elasticsearch 查询超10000的解决方案

前言 默认情况下&#xff0c;Elasticsearch集群中每个分片的搜索结果数量限制为10000。这是为了避免潜在的性能问题。 但是我们 在实际工作过程中时常会遇到 需要深度分页&#xff0c;以及查询批量数据更新的情况 问题&#xff1a;当请求form size >10000 时&#xff0c…

javascript设计模式总结

参考 通过设计模式可以增加代码的可重用性、可扩展性、可维护性 设计模式五大设计原则 单一职责&#xff1a;一个程序只需要做好一件事&#xff0c;如果结构过于复杂就拆分开&#xff0c;保证每个部分独立 开放封闭原则&#xff1a;对扩展开放&#xff0c;对修改封闭。增加需…

【FreeRTOS】IAR的FreeRTOSConfig.h中在添加头文件的问题

1、今天在\FreeRTOSConfig.h中添加个头文件&#xff0c;总是在头文件的函数定义处报错&#xff1a; Error[40]: Bad instruction 2、百度了半天也没有找到问题 3、原来是这个原因&#xff1a; IAR的Freertos中需加上一个portasm.s的驱动文件&#xff0c;而该文件需要调…

印尼Facebook直播网络需要达到什么要求?

在全球化浪潮的推动下&#xff0c;海外直播正受到企业、个人和机构的广泛关注和青睐。无论是用于营销、推广还是互动&#xff0c;海外直播为各种组织提供了更多机会和可能性。本文将探讨在进行印尼Facebook直播前&#xff0c;需要满足哪些网络条件以确保直播的质量和用户体验。…

南通网站制作基本步骤有哪些

南通网站制作是一个非常重要的工作&#xff0c;它可以帮助企业展示产品、服务和品牌形象&#xff0c;吸引更多的客户和创造更多的商机。网站制作的基本步骤包括需求分析、规划设计、页面制作、网站测试和上线等。 首先是需求分析。在南通网站制作的初期阶段&#xff0c;需要和客…

Spark SQL----CREATE FUNCTION

Spark SQL----CREATE FUNCTION 一、描述二、语法三、参数四、例子 一、描述 CREATE FUNCTION语句用于在Spark中创建临时或永久函数。临时函数的作用域位于会话级别&#xff0c;永久函数在持久目录中创建&#xff0c;并可用于所有会话。USING子句中指定的资源在第一次执行时可供…

批量提取PDF指定区域内容到 Excel , 根据PDF文件第一行文字来自动重命名v1.3-附思路和代码实现

本次文章更新内容&#xff0c;图片以及扫描的PDF也可以支持批量提取指定区域内容了&#xff0c;主要是通过截图指定区域&#xff0c;然后使用OCR来识别该区域的文字来实现的&#xff0c;所以精度可能会有点不够&#xff0c;但是如果是数字的话&#xff0c;问题不大&#xff1b;…

高级java每日一道面试题-2024年7月13日

面试官问: 你对序列化了解多少 我回答 1. 什么是序列化和反序列化 序列化&#xff1a;是指将对象的状态转换为字节流的过程&#xff0c;使得对象可以被存储或在网络中传输。反序列化&#xff1a;则是将字节流还原成对象的过程。 2. 目的和用途 **数据存储&#xff1a;**将…

一周年——相遇知音

——献给ZINCFFO 有梦便追&#xff0c;何惧&#xff1f; “杂乱无章”的代码片在昏暗的灯光下显得让人心生些许倦意。“我为什么天天都要练习呢&#xff1f;”无奈地合上笔记本电脑&#xff0c;当时多么想把电脑䣹&#xff08;fāi&#xff09;在地上&#xff0c;那就仿佛放下…

OpenGL笔记五之VBO与VAO

OpenGL笔记五之VBO与VAO 总结自bilibili赵新政老师的教程 code review! 文章目录 OpenGL笔记五之VBO与VAO1.VBO2.VAO3.VBO与VAO对比 1.VBO 代码 void prepareVBO() {//1 创建一个vbo *******还没有真正分配显存*********GLuint vbo 0;GL_CALL(glGenBuffers(1, &vbo))…

使用uni-app和Golang开发影音类小程序

在数字化时代&#xff0c;影音内容已成为人们日常生活中不可或缺的一部分。个人开发者如何快速构建一个功能丰富、性能优越的影音类小程序&#xff1f;本文将介绍如何使用uni-app前端框架和Golang后端语言来实现这一目标。 项目概述 本项目旨在开发一个个人影音类小程序&#…