5.7 线程

进程:解耦稳定,内容之间是不相关的,通信不便利,理论上进程的软硬件的切换时间以及创建开销非常大。--------》资源共享线程实现

线程的问题:本质就是不解耦,一个出问题别的就很有可能出问题,同时资源的处理也会有些混乱

线程依赖于进程而存在,在同一个进程的不同的线程中是共享代码段和数据段和堆,线程的栈是不共享的(也就是局部变量的存储位置)。

相较于父子进程,线程分为主子进程。

进程会主动创建主线程,main函数是主线程的入口逻辑,主线程(必须是通过return死掉)终止时-------》进程会终止-------》所有的线程也就会终止。

就比如说以pthread_exit方式退出的主线程,这样的话子线程不会终止。

lwp中文含义是轻量级进程,只是一个线程的标识,并不是线程的id!!

可以通过ps -elLf来查看线程的情况

usleep()就可以睡微秒

相较于父子进程是通过返回值进行判断,线程创建以后是通过自己独立的一个函数来进行实现,理解主线程的入口函数是main函数,但是子线程的入口函数是自己额外定义的函数。

信号是发送给进程的,线程和信号一般是不相容的。

对于linux操作系统而言,每一个线程都有一个task_struct(主要就是栈的信息栈的地址,其他的重要信息都是存放在进程的struct),注意进程也会维护一个大的task_struct,如果说有两个线程,那么就会有三个struct

这个时候子线程中的语句会打印两次,这个地方可以这样理解,主要是理解子线程先将数据由用户态放到内核态中,然后删除用户态中的数据,然后再将数据从内核态刷新到屏幕上。出现这种情况是因为子线程将数据复制到内核区域中,还没有来得及删除数据的时候,子线程的时间片就终止了。主线程要终止的时候就会将缓冲区中的数据放到内核缓冲区中,这样的话刷到输出屏幕中的时候就会刷新两次。

线程相关的检错不要用error_check,由专门的检错函数,因为ERROR_CHECK是通过errorno来进行判断,但是可能出现这个问题就是errorno不知道是哪个线程出现的问题。线程是通过函数的返回值来进行错误信息判断。???????????

子线程可以拿到其他线程栈上的数据,并且也可以进行修改,只要是进程中的数据都可以访问到,但是一定注意一点就是子线程和主线程的栈是独有的,而不是用来共享的。
int num = 10;

pthread_create(&pt, NULL, func, (void*) num)

传递数据:一般可以在堆上进行数据的传递,但有时候数据比较少的时候可以将数值转化为指针来实现。这个地方容易出现问题,因为可能那个线程栈中的数据会丢失当线程死亡的时候。

有时可能想要在线程之间传递信息,这个时候不想让别的线程来修改本线程中的数据,所以说用一个数据来充当一个地址来进行传递。

pthread_join是一个线程等待当前进程中的另外一个线程退出,与主线程和子线程无区分,因为有参数来指明是哪一个线程。另外一个参数是一个返回值是一个二级指针,是指向void*这个返回值一级指针的。

void *p;在用&p来实现一个二级指针。不能直接用二级指针因为这个时候返回的不是指向堆上一块区域的指针,而是指向这个存储这个指针的一个指针。

有点像wait函数waitpid函数只是这个是父进程是必须要等到子进程的。

可以有多个线程进行pthread_join来捕获线程,但是只能有一个线程可以捕获到。

线程和进程一般不会让死亡,都是让睡觉,因为再次创建的开销也是比较大的。

主动退出和被动退出,主动退出就是自己退出例如return和exit,被动推出就是ctrl+c和其他一些中断。

exit在子函数中可以退出,但是return必须要在主逻辑中使用才可以返回。

pthread_exit()和return返回值对于pthread_join而言是一样的,都是可以被pthread接收到。

pthread_exit具有资源清理能力,但是return不具有这个能力。

进程的退出主要是被动退出借助于信号进行退出,线程不能借助于信号进行退出,因为信号不知道要给哪个线程,但是知道给哪个进程。

pthread_cancel(son_id);调用这个函数,这个线程会修改另外一个线程的退出位,但是可能不会进行检查所以说这个时候线程是取消不掉的。就像是说一个线程只是用来进行计算的。

线程只有在走到取消点函数的时候才会检测退出标记位。会引发阻塞的函数和IO操作都可以认为是取消点函数,read,sleep(2), printf()

这种情况下如果想要退出一个函数就使用手打取消点pthread_testcancle();这个函数就只是检查退出位有没有被修改。

pthread_cancle是没有返回值的,还没有执行到exit返回的一个值。

线程对于资源的管理就是比较困难的,因为被动退出可能不能将资源进行清理,因为会在取消点线程就退出了,不能将相应的打开文件关闭。可以通过资源清理栈来进行实现,最后会有两种实现的方式包括1.主动退出的话,需要借助于手动出栈进行资源的清理。也就是说如果return放在手动清理之前不会清理,exit特殊会清理了解

2.被动退出的话,程序会自动执行清理工作。pthread_cleanup_push,  pthread_clean_pop

push和pop之间是一个大括号,如果在这中间定义的变量相当于局部变量

框架:

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

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

相关文章

Scanner中next()、nextInt()、nextLine()、hasNext()、hasNextInt()的使用方法及注意事项

目录 1、next()、nextInt()、nextLine()的使用方法及区分 2、循环时如何使用hasNext方法 3、用hasNextInt()作为判断下一个输入是否为数字需要配合next()方法使用 1、next()、nextInt()、nextLine()的使用方法及区分 三者简单定义 next():此方法遇见第一个有效字符…

使用AIGC生成软件类图表

文章目录 如何使用 AI 生成软件类图表什么是 MermaidMermaid 的图片如何保存?mermaid.liveDraw.io Mermaid可以画什么图?流程图时序图 / 序列图类图状态图甘特图实体关系图 / ER图 如何使用 AI 生成软件类图表 ChatGPT 大语言模型不能直接生成各类图表。…

linux系统下产生Segmentation fault 与 Segmentation fault (core dumped)!!!

最近在学习的过程中,遇到了Segment fault(段错误)的问题,经过一番查找资料,学到了一些相关知识,这里做一个梳理,以防以后在遇到类似的问题,并且希望能够帮助到大家一丝丝&#xff01…

python中numpy库使用

array数组 生成array数组 将list转化为array数组 import numpy as np np.array([1,2],typenp.int32)其中dtype定义的是元素类型,np.int32指32位的整形 如果直接定义dtypeint 默认的是32位整形。 zeors和ones方法 zeros()方法,该方法和ones()类似&a…

有什么方便实用的成人口语外教软件?6个软件教你快速进行口语练习

有什么方便实用的成人口语外教软件?6个软件教你快速进行口语练习 口语能力在语言学习中占据着重要的位置,因为它直接关系到我们与他人进行交流和沟通的效果。为了提高口语能力,很多成人选择通过外教软件进行口语练习,这些软件提供…

GNU Radio FFT模块结合stream to vector应用及Rotator频偏模块使用

文章目录 前言一、FFT 模块应用1、stream to vector 介绍2、创建 grc 图测试3、运行结果 二、频偏模块1、Rotator 简介2、创建 grc 图测试3、运行结果 前言 写个博客记录一下自己的蠢劲儿,之前我想用 FFT 模块做一些信号分析的东西,官方的 FFT 模块必须…

营销5.0时代,企业的痛如何解?

进入营销5.0阶段之后,许多企业都需解决连接客户效能低下的问题。针对这个问题,产品经理、软件开发公司包括个人开发者,要怎么找到有效的“解药”? 营销不仅每年都在变化,甚至每天都在变化。 ——现代营销学之父&…

【再探】设计模式—适配器、装饰及外观模式

结构型设计模式是用于设计对象和类之间关系的一组设计模式。一共有7种:适配器模式、装饰器模式、外观模式、桥接模式、组合模式、享元模式及代理模式。 1 适配器模式 需求:在软件维护阶段,已存在的方法与目标接口不匹配,需要个中…

论文阅读:RHO-1:Not All Tokens Are What You Need 选择你需要的 Tokens 参与训练

论文链接:https://arxiv.org/abs/2404.07965 以往的语言模型预训练方法对所有训练 token 统一采用 next-token 预测损失。作者认为“并非语料库中的所有 token 对语言模型训练都同样重要”,这是对这一规范的挑战。作者的初步分析深入研究了语言模型的 t…

记录一个练手的js逆向password

很明显 请求加密了password 全局搜索 有个加密函数(搜不到的可以搜临近的其他的关键字 或者url参数) 搜索的时候一定要仔细分析 我就没有仔细分析 我搞了好久 又是xhr又是hook的(还没hook到) 我当时也是疏忽了 我寻思这个也不是js文件 直到后来 我怎么也找不到 我就猜想 不…

代码随想录算法训练营DAY44|C++动态规划Part6|完全背包理论基础、518.零钱兑换II、377. 组合总和 Ⅳ

文章目录 完全背包理论基础完全背包问题的定义与01背包的核心区别为什么完全背包的循环顺序可以互换?CPP代码 ⭐️518.零钱兑换II思路CPP代码 ⭐️377. 组合总和 Ⅳ思路CPP代码 扩展题 完全背包理论基础 卡码网第52题 文章链接:完全背包理论基础 视频链接…

【数据结构与算法】力扣 102. 二叉树的层序遍历

题目描述 给你二叉树的根节点 root ,返回其节点值的 层序遍历 。 (即逐层地,从左到右访问所有节点)。 示例 1: 输入: root [3,9,20,null,null,15,7] 输出: [[3],[9,20],[15,7]]示例 2&#x…

上证50etf期权到底该怎么玩?

今天期权懂带你了解上证50etf期权到底该怎么玩?ETF期权是一种股票市场上的金融衍生品,它是在交易所上市交易的期权合约,其标的资产是某个特定的交易所交易基金(ETF),如上证50指数ETF或沪深300指数ETF等。 上…

Git命令Gitee注册idea操作git超详细

文章目录 概述相关概念下载和安装常见命令远程仓库介绍与码云注册创建介绍码云注册远程仓库操作关联拉取推送克隆 在idea中使用git集成add和commit差异化比较&查看提交记录版本回退及撤销与远程仓库关联 push从远程仓库上拉取,克隆项目到本地创建分支切换分支将…

(✌)粤嵌—2024/5/7—除自身以外数组的乘积

代码实现&#xff1a; /*** Note: The returned array must be malloced, assume caller calls free().*/ int* productExceptSelf(int *nums, int numsSize, int *returnSize) {// 左乘积int l[numsSize];l[0] 1;for (int i 1; i < numsSize; i) {l[i] l[i - 1] * nums[…

Cesium学习——渲染、加载GeoJSON、调整位置

渲染概述 作者&#xff1a;当时明月在曾照彩云归 出处&#xff1a;https://www.cnblogs.com/jiujiubashiyi/p/17124717.html 1. 引言 Cesium是一款三维地球和地图可视化开源JavaScript库&#xff0c;使用WebGL来进行硬件加速图形&#xff0c;使用时不需要任何插件支持&#xf…

以中国为目标的DinodasRAT Linux后门攻击场景复现

概述 在上一篇《以中国为目标的DinodasRAT Linux后门剖析及通信解密尝试》文章中&#xff0c;笔者对DinodasRAT Linux后门的功能及通信数据包进行了简单剖析&#xff0c;实现了对DinodasRAT Linux后门心跳数据包的解密尝试。 虽然目前可对DinodasRAT Linux后门的通信数据包进…

SecretFlow学习指南(3)框架拆解和使用

“隐语”架构设计全貌 1.隐语框架设计思想 隐私计算是一个新兴的跨学科领域&#xff0c;涉及密码学、机器学习、数据库、硬件等多个领域。根据过去几年的实践经验&#xff0c;我们发现 ●隐私计算技术方向多样&#xff0c;不同场景下有其各自更为合适的技术解决方案 ●隐私计算…

Windows系统安装MySQL数据库详细教程

【确认本地是否安装mysql】 &#xff08;1&#xff09;按【winr】快捷键打开运行&#xff1b; &#xff08;2&#xff09;输入services.msc&#xff0c;点击【确定】&#xff1b; &#xff08;3&#xff09;在打开的服务列表中查找mysql服务&#xff0c;如果没有mysql服务&am…

麦肯锡精英高效阅读法笔记

系列文章目录 如何有效阅读一本书笔记 读懂一本书笔记 麦肯锡精英高效阅读法笔记 文章目录 系列文章目录序章 无法读书的5个理由无法读书的理由① 忙于工作&#xff0c;没时间读书无法读书的理由② 不知应该读什么无法读书的理由③ 没读完的书不断增多无法读书的理由④ 工作繁…