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://xiahunao.cn/news/3017620.html

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

相关文章

关于获取邮件授权码

以网易邮箱为例: 第一步:登录之后点击设置 第二步:点击POP3/SMTP/IMAP 第三步:开启SMTP服务 开启哪个都可以 第四步: 扫描二维码开启服务 第五步: 使用手机扫面二维码发送短信 第六步: 得到授权码 将授权码写入配置文件

04-28 周日 FastAPI Post请求同时传递文件和普通参数

04-28 周日 FastAPI Post请求同时传递文件和普通参数 时间版本修改人描述04-28 周日V0.1宋全恒新建文档2024年5月6日14:20:05V1.0宋全恒完成文档的传递 简介 由于在重构FastBuild的时候,为了支持TLS是否启用,在接口中需要同时传递文件参数和其他参数&am…

matlab 基于拉依达检验法(3σ准则) 实现多类别多参数的批量异常样本检验 V2.0

简介 拉依达检验法(3σ准则)是一种统计学方法,用于检测数据中的异常值。这种方法基于正态分布的特性来确定数据点是否可能是异常值。以下是关于拉依达检验法(3σ准则)的详细介绍: 基本原理: 拉…

代码随想录第四十六天|单词拆分

题目链接:. - 力扣(LeetCode)

2.4V转3.8V/3.9V供电升压方案:为水表提供稳定电力

随着科技的不断发展,水表等智能设备在我们的生活中扮演着越来越重要的角色。为了让水表得以正常工作,稳定的电力供应是至关重要的。在这篇文章中,我们将探讨一种2.4V转3.8V/3.9V供电方案,以确保为水表提供稳定的电力。 为了实现2…

每日两题 / 138. 随机链表的复制 148. 排序链表(LeetCode热题100)

138. 随机链表的复制 - 力扣(LeetCode) 用哈希表记录原链表中的节点是否被复制过 遍历原链表并通过哈希表维护新链表 /* // Definition for a Node. class Node { public:int val;Node* next;Node* random;Node(int _val) {val _val;next NULL;rand…

STM32F407VET6 学习笔记1:GPIO引脚认识分类与开发板原理图

今日学习STM32F407VET6 ,首先从基本原理图、引脚方面开始做个初步理解并整理: 这里使用的学习开发板是在嘉立创购买的 立创梁山派天空星,芯片是 STM32F407VET6 主要对这个芯片的引脚做一些归纳认识、对开发学习板原理图设计进行认识理解:最…

23 JavaScript学习:验证API

JavaScript验证API 举例&#xff1a; <input id"id1" type"number" min"100" max"300" required> <button onclick"myFunction()">验证</button><p id"demo"></p><script>f…

HarmonyOS实战开发-如何实现Web组件中网页长截图。

介绍 本案例实现了Web组件中网页长截图的方案。支持截图后展示大小浮窗预览、保存图片到相册、手势左滑关闭等功能。 效果图预览 实现思路 本解决方案通过循环滚动Web组件&#xff0c;每次滚动截取当前状态后拼接到离屏画布&#xff0c;最后一次性转为PixelMap图片并显示在全…

Arduino PlatformIO避坑记

实在受不了Arduino IDE上古时期的界面风格&#xff0c;最要命的是编译速度慢到极点&#xff0c;好在有PlatformIO。VS搭配PlatformIO&#xff0c;有微软加持&#xff0c;界面自然是妥妥的了&#xff0c;编译速度提升也肉眼可见。 至于PlatformIO的安装过程&#xff0c;网上教程…

Day 24 数据库管理及数据类型

数据库管理及数据类型 一&#xff1a;数据类型 1.数值类型 整数类型 ​ 整数类型&#xff1a;TINYINT SMALLINT MEDIUMINT INT BIGINT ​ 作用&#xff1a;用于存储用户的年龄、游戏的Level、经验值等 浮点数类型 ​ 浮点数类型&#xff1a;FLOAT DOUBLE ​ 作用&#xf…

超疏水TiO₂纳米纤维网膜的良好性能

超疏水TiO₂纳米纤维网膜是一种具有特殊性能的材料&#xff0c;它结合了TiO₂的光催化性能和超疏水表面的自清洁、防腐、防污等特性。这种材料在防水、自清洁、油水分离等领域具有广阔的应用前景。 制备超疏水TiO₂纳米纤维网膜的过程中&#xff0c;通过精确控制纺丝溶液的成分…

vue3专栏项目 -- 项目介绍以及准备工作

这是vue3TS的项目&#xff0c;是一个类似知乎的网站&#xff0c;可以展示专栏和文章的详情&#xff0c;可以登录、注册用户&#xff0c;可以创建、删除、修改文章&#xff0c;可以上传图片等等。 这个项目全部采用Composition API 编写&#xff0c;并且使用了TypeScript&#…

PyQt5中重要的概念:信号与槽

PyQt中信号与槽概念定义如下&#xff08;网络上引用的&#xff09;&#xff1a; 信号&#xff08;signal&#xff09;和槽&#xff08;slot&#xff09;是Qt的核心机制&#xff0c;也是在PyQt编程中对象之间进行通信的机制。在创建事件循环之后&#xff0c;通过建立信号和槽的…

3W 1.5KVDC 3KVDC 隔离宽范围输入,单、双输出 DC/DC 电源模块——TP2L-3W 系列

TP2L-3W系列是一款高性能、超小型的电源模块&#xff0c;宽范围2:1,4:1输入&#xff0c;输出有稳压和连续短路保护功能&#xff0c;隔离电压为1.5KVDC、3KVDC工作温度范围为–40℃到85℃。特别适合对输出电压的精度有严格要求的地方&#xff0c;外部遥控功能对您的设计又多一项…

AIGC绘画辅助网站

Midjourney风格样式 Midjourney Style Classifier | Andrei Kovalevs Midlibrary

Python-VBA函数之旅-property函数

目录 一、property函数的常见应用场景 二、property函数使用注意事项 三、如何用好property函数&#xff1f; 1、property函数&#xff1a; 1-1、Python&#xff1a; 1-2、VBA&#xff1a; 2、推荐阅读&#xff1a; 个人主页&#xff1a;神奇夜光杯-CSDN博客 一、prop…

Django 4.x 智能分页get_elided_page_range

Django智能分页 分页效果 第1页的效果 第10页的效果 带输入框的效果 主要函数 # 参数解释 # number: 当前页码&#xff0c;默认&#xff1a;1 # on_each_side&#xff1a;当前页码前后显示几页&#xff0c;默认&#xff1a;3 # on_ends&#xff1a;首尾固定显示几页&#…

多对多字段,执行aerich migrate命令报错

报错状态&#xff1a; 解决&#xff1a; 目前只知道通过修改源码的方式进行更改

【牛客】【模板】差分

原题链接&#xff1a;登录—专业IT笔试面试备考平台_牛客网 目录 1. 题目描述 2. 思路分析 3. 代码实现 1. 题目描述 2. 思路分析 差分模板。 b[0]a[0]; b[1]a[1]-a[0]; b[2]a[2]-a[1]; ...... b[n-1]a[n-1]-a[n-2]; b[n]a[n]-a[n-1]; 差分标记&#xff1a;b[l]k,b…