Linux系统编程07

news2024/9/22 11:42:25

线程

为什么有了进程还需要线程
进程切换的时候会花费很大的代价
(1)上下文切换,CPU寄存器需要切换
(2)虚拟地址和物理地址的映射需要切换
进程间通信麻烦

线程是轻量级的进程

(1)线程是一个正在执行的程序,但是它不在是资源分配的最小单位

(2)同一个进程存在多个线程,多个线程共享内存资源

(3)线程也有上下文状态(主要的是PC指针stack(栈)指针

在这里插入图片描述

用户级线程:不能够被CPU感知到的CPU不能根据用户使用线程的多少来进行调度,用户自己分配这个进程内部各个CPU使用情况,线程调度由进程处理
内核级线程:线程调用是由操作系统处理
CPU调度以线程为单位
原来的进程都是当线程进程
在Linux操作系统中,进程控制块和线程控制块合二为一了,每个进程和线程都有task_struct的描述

引入线程的好处

(1)减少了上下文切换的代价

(2)消灭了页表切换

(3)线程是共享内存的可以无痛通信

创建线程

当我们启动进程就会自动创建一个主线程,主线程栈区从main函数开始压栈

在主线程中可以使用pthread_create函数创建一个子线程

在这里插入图片描述
pthread_t *thread:线程ID,不同操作系统中pthread的实现是不一样的
pthread_attr *attr:线程的属性,填NULL表示我们使用默认属性
void *(*start routine) (void *):线程启动函数,参数和返回值都是void*类型-----void *func(void*) 子线程的main函数
void *arg:传递给start_routine的参数

获取自己线程的线程ID
在这里插入图片描述
在这里插入图片描述
Makefile文件后面添加-pthread
在这里插入图片描述
main主线程创建一个子线程,让主线程和子线程输出自己的线程ID
在这里插入图片描述
如果我们让父线程sleep(1),最终只会打印main主线程的线程ID,因为当主线程main,也就是进程终止了,那么这个进程里面的线程也就无法运行了
在这里插入图片描述
如果我们让主线程只睡20微秒,那么我们打印输出的记录有可能由三条记录,也有可能只有两条记录,因为数据从输入到展示在命令框要经过三个步骤,首先是printf将数据拷贝到stdoutstdout将数据拷贝(原子操作)到内核的文件对象,然后再清空我们的stdout,因此主线程有可能在清空stdout之前就终止,这时,命令框已经输出一次数据,然后发现stdout的数据还存在,就会把stdout的数据在刷新一遍在显示框,这就出现打印三次结果

多线程下不能使用perror
一个典型的报错会做两件事
(1)return -1
(2)修改全局变量errno
然后perror会根据errno生成错误提示字符串,所以perror依赖的数据就会存储在数据段里面,但是多个和线程都可以同时共同访问一个数据段,但是此时如果由多个进程报错,其他线程报错信息会覆盖本线程的包i错信息,因此就不能获取到正确的错误信息
在多线程中报错不会返回-1,而是返回数值,通过返回值数值来确定报错的类型

strerror可以通过传入的数值返回给我们一个错误提示字符串
唯一的坏处是它不能打印这个字符串,因此我们需要通过 fprintf(stderr)来将错误信息输出
在这里插入图片描述
在这里插入图片描述

检测我们的进程能够创建多少线程
在这里插入图片描述

多线程共享内存空间

多线程可以共享同一个数据段
在这里插入图片描述

多线程共享堆空间,主线程和子线程使用同一个数值的地址使用pthread_create传递地址参数,其实我们是直接把第四个参数拷贝到另外一个线程的栈帧里面

在这里插入图片描述

多线程之间传递一个整数,直接传递一个long类型的数据,因为void *是8个字节,long类型也是8个字节,不会有信息丢失,如果我们希望主线程和子线程之间共享内存那么就传递指针,如果不希望共享内存你那么久传递long类型。void *既可以当指针用也可以当long来用

在这里插入图片描述

多线程的栈区是相对独立的,一个线程可以通过地址区访问另一个线程的栈区

线程的终止

一个进程中的任意一个线程只要触发其中任意一个信号,那么整个进程就会终止,其中所有的线程也都会终止

(1)main 线程的return函数、(2)exit命令、(3)_exit/_Exit 、(4)abort、(5)收到导致进程终止的信号

子线程终止自己
(1)从threadFuncreturn(尽量不要用)
(2)pthread_exit(主线程不要调用)

void *retval子线程的返回值

在这里插入图片描述

pthread_join回收线程的资源

join等待任何一个线程的终止
在这里插入图片描述

pthread_t thread目标线程的tid(不是一个指针)
void **retval是拷贝子线程的终止状态,主调函数中申请void * 的内存join试图修改主调函数中的void *
在这里插入图片描述

join和exit的例子

在这里插入图片描述

pthread_join的的错误用法

在这里插入图片描述

多线程和信号不能同时使用

多线程会共享注册信号的信息,用户无法得知是哪个线程递送信号

线程的取消类似于信号:线程可以在运行过程中给别的线程发送一个取消请求,另一个线程收到取消请求之后,他不会立刻终止,他会将自己的取消标志置为1,运行到一些特殊函数的时候就会取消,在一些特殊函数之前或者调用之后就会取消进程,这些特殊的函数称之为取消点

在这里插入图片描述

取消点函数
(1)操作文件的系统调用、(2)可能引发阻塞的系统调用;库函数和系统调用都是取消点函数
pthread_mutex_lock加锁不是取消点
在这里插入图片描述

如果线程是被pthread_cacel终止的并且取消成功,那么终止的线程返回值为-1
在这里插入图片描述

但是如果线程没有碰到取消点函数那么也就不会执行终止指令,会继续执行下去

ps -elLf|grep pthread_cancel查看线程运行状态
在这里插入图片描述

手动增加取消点
pthread_testcancel如果取消标志位为真,就终止本线程
在这里插入图片描述
在这里插入图片描述

异步终止可能会导致资源泄漏,因为mallocfree函数都是取消点,我们不知道pthrread_cancel函数实在malloc之前还是free之后或者是在mallocfree之间,这就很容易造成资源泄漏。
因此在目标线程运行到取消点函数和取消点函数调用完前终止线程之间会调用线程中终止清理函数

资源清理栈(自动根据申请了多少资源,就释放多少资源)

当我们申请资源malloc ; open/fopen/opendir ; semop/mutex_lok对应的释放行为 free ; close/fclose/closedir ; semop/mutex_unlock,

我们会去维护一个特殊的结构,资源清理栈,里面存储了资源释放的行为,当我们申请资源之后就会把对应的释放行为压栈(pthread_cleanup_push

当线程因为(1)pthread_exit(不包括在启动函数中return)、(2)被cancel终止时;将栈清空
线程可以主动调用pthread_cleanup_pop释放资源
在这里插入图片描述

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

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

相关文章

【设计模式】第4节:创建型模式之“单例模式”

一、介绍 采取一定的方法保证在整个的软件系统中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象实例的方法。 不使用单例模式的UML类图: 使用单例模式的UML类图: 使用场景: 需要频繁创建或销毁的对象…

【密评】商用密码应用安全性评估从业人员考核题库(十二)

商用密码应用安全性评估从业人员考核题库(十二) 国密局给的参考题库5000道只是基础题,后续更新完5000还会继续更其他高质量题库,持续学习,共同进步。 2751 多项选择题 GM/T 0051《 密码设备管理 对称密钥管理技术规范…

倾斜摄影三维模型根节点合并效率提升的技术方法分析

倾斜摄影三维模型根节点合并效率提升的技术方法分析 提高倾斜摄影三维模型根节点合并效率是倾斜摄影领域的重要挑战之一。快速而准确地处理大量数据和复杂的场景需要使用高效的技术方法。本文将探讨几种可以提高倾斜摄影三维模型根节点合并效率的技术方法。 首先,使…

可视化工具Datart踩(避)坑指南(7)——下载的极限

作为目前国内开源版本最好用的可视化工具之一,Datart无疑是低成本高效率可供二开的可视化神兵利器。当然,免费的必然要付出一些踩坑的代价。 本篇我们来讲一讲可视化工具Datart踩(避)坑指南(7)之下载的极限…

大语言模型在天猫AI导购助理项目的实践!

本文主要介绍了Prompt设计、大语言模型SFT和LLM在手机天猫AI导购助理项目应用。 ChatGPT基本原理 “会说话的AI”,“智能体” 简单概括成以下几个步骤: 预处理文本:ChatGPT的输入文本需要进行预处理。 输入编码:ChatGPT将经过预…

Ubuntu22.04(非虚拟机)安装教程(2023最新最详细)

目录 简介 一.下载Ubuntu Server镜像,官方地址下载即可 ​二.安装Ubuntu镜像 简介 Linux是一种自由和开放源代码的操作系统内核,被广泛应用于各种计算机系统中。它以稳定性、安全性和灵活性而闻名,并成为服务器、嵌入式设备和个人计算机等…

国产手机性能再次飞升,H公司落后三代,但仍然比不过苹果

国产手机将采用全新的芯片,性能将进一步提升,这是国产手机的又一个重大进步,这次不再挤牙膏,真正为消费者带来性能跃升的手机,让消费者刷视频更流畅,玩游戏也更畅快。 据了解国产手机即将采用的新款芯片骁龙…

EMT4J—— Java 版本迁移检测工具

最近因为工作需要研究了emt4j,这里写一篇文章记录一下。 非专业Java er,有不同意见欢迎评论区分享。 目录 EMT4J是什么? 如何使用? Command-line Java Agent 简单的源码分析 目录分析 规则解析 参考资料 EMT4J是什么&am…

nginx只允许英文名的文件下载,中文名就是找不到文件

本文主要向大家介绍了Linux运维知识之linux下nginx不支持中文URL路径的解决方案,通过具体的内容向大家展现,希望对大家学习Linux运维知识有所帮助。 1、确定你的系统是UTF编码 [rootlocalhost ~]# echo $LAGN en_US.UTF-8 2、nginx配置文件里默认编码…

python爬虫之正则表达式实战----爬取图片

文章目录 1. 图片爬取流程分析2. 爬取家常菜图片 1. 图片爬取流程分析 先获取网址,URL:https://www.xiachufang.com/category/40076/ 定位想要爬取的内容使用正则表达式爬取导入模块指定URLUA伪装(模拟浏览器)发起请求&#xff0…

【springcloud-config】配置中心客户端导入依赖spring-cloud-config-server后,maven一直爆红问题解决

问题描述 配置中心客户端导入了 spring-cloud-config-server 后&#xff0c;导入依赖爆红&#xff1b; 解决办法&#xff1a; 参考官网中文文档&#xff1a;spring-cloud -config 配置中心 中文文档 补充导入 spring-config-starter-config 配置即可 <!--springcloud-c…

Transformer英语-法语机器翻译实例

依照Transformer结构来实例化编码器&#xff0d;解码器模型。在这里&#xff0c;指定Transformer编码器和解码器都是2层&#xff0c;都使用4头注意力。为了进行序列到序列的学习&#xff0c;我们在英语-法语机器翻译数据集上训练Transformer模型&#xff0c;如图11.2所示。 da…

【设计模式】第5节:创建型模式之“简单工厂、工厂方法和抽象工厂模式”

一、简单工厂模式 ProductFactory是创建商品的工厂&#xff0c;商品Product可以实现Product接口中的一些功能。 当需要根据入参的不同生成多种不同的产品时&#xff0c;可以将生成不同产品的逻辑剥离出来&#xff0c;使用产品工厂创建不同的产品。 二、工厂方法 ConcreteFact…

知识点滴 - Email地址不区分大小写

电子邮件地址本身对字符大小写不敏感。这意味着实际的电子邮件地址&#xff0c;如 "exampleemail.com"&#xff0c;并不区分字母的大小写。无论你输入的是大写字母还是小写字母&#xff0c;它仍然会到达同一个电子邮件账户。例如&#xff0c;如果您的电子邮件地址是 …

信创生态丨九州未来与超聚变完成兼容性互认证

近日&#xff0c;九州未来与超聚变积极开展了兼容性适配工作&#xff0c;并完成产品兼容性互认证。双方兼容性测试基于Intel64、鲲鹏架构完成&#xff0c;测试结果显示&#xff1a;九州未来Animbus IaaS V8可基于超聚变FusionOS 23服务器操作系统安全稳定运行&#xff0c;产品相…

并发编程-线程池ForkJoinPool工作原理分析

由一道算法题引发的思考 算法题&#xff1a; 如何充分利用多核CPU的性能&#xff0c;快速 对一个2千万大小的数组进行排序&#xff1f; 分解 求解 合并 这道算法题可以拆解来看&#xff1a; 1&#xff09;首先这是一道排序的算法题&#xff0c;而且是需要使用高效的排序算法…

[量化投资-学习笔记003]Python+TDengine从零开始搭建量化分析平台-Grafana画K线图

在前面两个笔记&#xff1a; PythonTDengine从零开始搭建量化分析平台-数据存储 PythonTDengine从零开始搭建量化分析平台-MA均线的多种实现方式 中有提到使用 Grafana 画图&#xff0c;不过画的都是均线。除了均线&#xff0c;Grafana 非常人性的提供离 K线图模块。 配置简单…

深度学习 anaconda 安装问题

配置anaconda 在官网下载匹配版本的anaconda&#xff08;官网下载可能时间比较长&#xff09;&#xff0c;可以选择清华镜像。 安装过程默认即可&#xff0c;或者根据情况进行修改。 旧版本是可以在安装的时候勾选添加路径到环境变量中的&#xff0c;但是我安装的是2023.9月…

代码随想录算法训练营第三十三天丨 贪心算法part04

860.柠檬水找零 思路 这道题目刚一看&#xff0c;可能会有点懵&#xff0c;这要怎么找零才能保证完成全部账单的找零呢&#xff1f; 但仔细一琢磨就会发现&#xff0c;可供我们做判断的空间非常少&#xff01; 只需要维护三种金额的数量&#xff0c;5&#xff0c;10和20。 …

计算机中了mallox勒索病毒怎么办,勒索病毒解密,数据恢复

最近一段时间&#xff0c;云天数据恢复中心陆续收到很多企业的求助&#xff0c;企业的计算机服务器遭到了mallox勒索病毒攻击&#xff0c;导致企业的数据库无法正常使用&#xff0c;严重影响了企业的正常生产生活&#xff0c;为此&#xff0c;云天数据恢复中心的工程师通过对此…