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之间是一个大括号,如果在这中间定义的变量相当于局部变量

框架:

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【YoloDeployCsharp】基于.NET Framework的YOLO深度学习模型部署测试平台

YoloDeployCsharp|基于.NET Framework的YOLO深度学习模型部署测试平台 1. 项目介绍2. 支持模型3. 时间测试4. 总结 1. 项目介绍 基于.NET Framework 4.8 开发的深度学习模型部署测试平台,提供了YOLO框架的主流系列模型,包括YOLOv8~v9,以及其系…

python实现的信号合成分析系统(DSP)

python实现的信号合成分析系统(DSP) 流程 1、在QT界面上设置好信号频率,采样频率,采样点数 2、使用np构建sin函数 3、使用matplotlib画出 4、分别分析合成信号的FFT频域信息1、效果图 2、示例代码 def btn_com_clicked(self):# 信号合成分析Fs = self.com_fs_edit_value #…

HarmonyOS开发案例:【电子相册】

介绍 如何实现一个简单的电子相册应用的开发,主要功能包括: 实现首页顶部的轮播效果。 实现页面跳转时共享元素的转场动画效果。 实现通过手势控制图片的放大、缩小、左右滑动查看细节等效果。 相关概念 [Swiper]:滑块视图容器&#x…

cmake install命令无法覆盖同名文件

文章目录 1. 问题记录2. 原因排查3. 解决方案 1. 问题记录 我有两个同名文件test.txt,它们内容不同,但时间戳相同(文件属性中的修改时间相同) 我希望在cmake中利用install命令,将${PATH_SRC}/test.txt替换${PATH_DES…

Elasticsearch:使用 MongoDB connector 同步数据到 Elasticsearch

MongoDB 是一个基于分布式文件存储的数据库。由 C 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。Elasticsearch 是一个高效强…

[CISCN2019 华北赛区 Day1 Web2]ikun

看到提示说一定要找到lv6 这要写脚本来爆破了,用bp是爆破不出来的 发现LV等级都是有参数挂着的 写个脚本看一下 import requests for i in range(1,1000):payload"http://node4.anna.nssctf.cn:28150/shop?page%d"%(i)resrequests.get(payload)if "…

【PCIE】基于PCIE4C的数据传输(四)——使用MSIX中断

基于PCIE4C的数据传输(三)——遗留中断与MSI中断 一文介绍了遗留中断与MSI中断两种中断方式的代码实现,本文继续基于Xilinx UltrascaleHBM VCU128开发板与linux(RHEL8.9),介绍MSIX中断方式的代码实现。本文…

矩阵的压缩存储介绍

引入 概述 特殊矩阵的压缩 对称矩阵 三角矩阵 对角矩阵 稀疏矩阵 三元组存储 十字链表法 示例

java:递归实现的案例

//求第20个月兔子的对数 //每个月兔子对数:1,1,2,3,5,8 public class Test {//求第20个月兔子的对数//每个月兔子对数:1,1,2,3,5,8pu…

《Python编程从入门到实践》day21

# 昨日知识点回顾 设置背景颜色 在屏幕中央绘制飞船 # 今日知识点学习 12.5 重构:方法_check_events()和_update_screen() 12.5.1 方法_check_events() import sys import pygame from Settings import Settings from Ship import Shipclass AlienInvasion:"…

[Maven]IDEA报错-xxx is referencing itself

在IDEA中,执行 mvn clean时报错xxx is referencing itself。 解决方案:https://stackoverflow.com/questions/64246267/maven-error-using-intellij-is-referencing-itself 具体做法:采用上图第二条,将父模块pom文件中的对子模块…

练习题(2024/5/7)

1验证二叉搜索树 给你一个二叉树的根节点 root ,判断其是否是一个有效的二叉搜索树。 有效 二叉搜索树定义如下: 节点的左 子树 只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 示例 …

JSP企业快信系统的设计与实现参考论文(论文 + 源码)

【免费】JSP企业快信系统.zip资源-CSDN文库https://download.csdn.net/download/JW_559/89277688 JSP企业快信系统的设计与实现 摘 要 计算机网络的出现到现在已经经历了翻天覆地的重大改变。因特网也从最早的供科学家交流心得的简单的文本浏览器发展成为了商务和信息的中心…

深入理解Java虚拟机(JVM)

引言: Java虚拟机(JVM)是Java平台的核心组件,它负责将Java字节码转换成平台特定的机器指令,并在相应的硬件和操作系统上执行。JVM的引入使得Java语言具有“一次编写,到处运行”的跨平台特性。本文将深入探…

【练习2】

1.汽水瓶 ps:注意涉及多个输入&#xff0c;我就说怎么老不对&#xff0c;无语~ #include <cmath> #include <iostream> using namespace std;int main() {int n;int num,flag,kp,temp;while (cin>>n) {flag1;num0;temp0;kpn;while (flag1) {if(kp<2){if(…

初识C++ · 类和对象(下)

目录 1 再谈构造函数 2 类中的隐式类型转换 3 Static成员 4 友元和内部类 5 匿名对象 6 编译器的一些优化 1 再谈构造函数 先看一段代码&#xff1a; class Date { public :Date(int year, int month, int day){_year year;_month month;_day day;} private:int _ye…

Redis线程模型

文章目录 &#x1f496; Redis 单线程模型⭐ 单线程监听大量的客户端连接⭐ Redis 6.0 之前为什么不用多线程&#xff1f; &#x1f496; Redis多线程⭐ Redis 后台线程⭐ Redis 网络IO多线程 对于读写命令来说&#xff0c;Redis 一直是单线程模型。不过&#xff0c;在 Redis 4…

TinyXML-2介绍

1.简介 TinyXML-2 是一个简单、小巧的 C XML 解析库&#xff0c;它是 TinyXML 的一个改进版本&#xff0c;专注于易用性和性能。TinyXML-2 用于读取、修改和创建 XML 文档。它不依赖于外部库&#xff0c;并且可以很容易地集成到项目中。 tinyXML-2 的主要特点包括&#xff1a…

华为:三层交换机与路由器连通上网实验

三层交换机是一种网络交换机&#xff0c;可以实现基于IP地址的高效数据转发和路由功能&#xff0c;通常用于大型企业、数据中心和校园网络等场景。此外&#xff0c;三层交换机还支持多种路由协议&#xff08;如OSPF、BGP等&#xff09;&#xff0c;以实现更为复杂的网络拓扑结构…

automa警惕通过点击元素打开新的标签页,因为你可能会被他蒙蔽!

大家好&#xff0c;我是大胡子&#xff0c;专注于研究RPA实战与解决方案。 我们经常用到automa里面的【点击元素】组件&#xff0c;但要警惕通过点击元素打开新的标签页&#xff0c;例如下面这个场景&#xff0c;点击公众号的图文消息&#xff0c;之后&#xff0c;要自动输入标…