当前位置: 首页 > news >正文

Linux系统编程07

线程

为什么有了进程还需要线程
进程切换的时候会花费很大的代价
(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释放资源
在这里插入图片描述

相关文章:

Linux系统编程07

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

html web前端 登录,短信验证码登录

html web前端 登录,短信验证码登录 1,手机号码格式校验 2,按钮点击60秒倒计时,按钮限制点击 3,验证码/或密码长度校验(被注释,公司发的验证码长度不一致,不一定是6位) 4…...

(免费领源码)php#Thinkphp#MYSQL校园二手交易app 99211-计算机毕业设计项目选题推荐

目 录 摘要 Abstract 1 绪论 1.1 研究背景 1.2国内外研究现状 1.3论文结构与章节安排 2 校园二手物品交易app系统分析 2.1 可行性分析 2.2 系统流程分析 2.2.1 数据流程 3.3.2 业务流程 2.3 系统功能分析 2.3.1 功能性分析 2.3.2 非功能性分析 2.4 系统用例分析…...

用Python做数据分析之数据筛选及分类汇总

1、按条件筛选(与,或,非) 为数据筛选,使用与,或,非三个条件配合大于,小于和等于对数据进行筛选,并进行计数和求和。与 excel 中的筛选功能和 countifs 和 sumifs 功能相似…...

RabbitMQ高级篇 笔记

这是一些高级的内容。 RabbitMQ还是运行在网络上的,倘若遇到了网络故障,mq自己挂了,出异常了,都会造成最终状态不一致的问题。这就是可靠性问题。 可靠性:一个消息发送出去之后,至少被消费1次。 要解决这3个…...

javaEE -9(7000字详解TCP/IP协议)

一: IP 地址 IP地址(Internet Protocol Address)是指互联网协议地址,又译为网际协议地址。 IP地址是IP协议提供的一种统一的地址格式,它为互联网上的每一个网络和每一台主机分配一个逻辑地址,以此来屏蔽物…...

在mybatis的xml中使用枚举来做判断条件

1.枚举类 import com.baomidou.mybatisplus.annotation.IEnum; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonValue; import com.shinkeer.common.utils.StringUtils;import java.util.HashMap; import java.util.Map;…...

scala集合的partition方法使用

在Scala中,partition 方法用于将集合(例如 List、Array ,Set等)中的元素根据给定的条件分成两个部分,并返回一个元组,其中包含两个新的集合,第一个包含满足条件的元素,另一个包含不满…...

18 Transformer 的动态流程

博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from333.1007.0.0 b 站直接看 配套 github 链接:https://github.com/nickchen121/Pre-training-language-model 配套博客链接:https://www.cnblogs.com/nickchen121/p/15105048.html 机…...

Android Studio新功能-设备镜像Device mirroring-在电脑侧显示手机实时画面并可控制

下载最新的灰测版本-蜥蜴 成功运行到真机后,点击右侧Running Devices选项卡,再点击号 选中当前设备; 非常丝滑同步,在电脑侧也可以顺畅控制真机 该功能大大方便了我们视线保持在显示器上专注开发,并且便于与UI视觉进行…...

MySQL身份验证绕过漏洞

搭建 vmihub靶场:vulhub靶场搭建与使用_剁椒鱼头没剁椒的博客-CSDN博客 运行漏洞: # 这里要改成自己的 /vulhub-master 存放目录 cd /etc/docker/vulhub-master/mysql/CVE-2012-2122# 关闭防火墙,不然就要放行3306端口 systemctl stop firewalld# 重启 Docker 服务 servic…...

0基础学习PyFlink——不可以用UDTAF装饰器装饰function的原因分析

在研究Flink的“用户自定义方法”(UserDefinedFunction)时,我们看到存在如下几种类型的装饰器: UDF:User Defined Scalar FunctionUDTF:User Defined Table FunctionUDAF:User Defined Aggrega…...

Spring Boot Endpoints:端点

Spring Boot 内置端点以及暴露端点列表: 端点被启用后,并不一定能够被访问,还要看端点是否被暴露,并且暴露的方式是怎样的。因为端点可能会包含敏感信息,所以需要谨慎暴露相关端点。Spring Boot 3.0.0 更改了默认暴露…...

漏洞复现--用友 畅捷通T+ .net反序列化RCE

免责声明: 文章中涉及的漏洞均已修复,敏感信息均已做打码处理,文章仅做经验分享用途,切勿当真,未授权的攻击属于非法行为!文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直…...

PHP 共享茶室棋牌室无人软硬件结合开发小程序系统的开发优势

随着科技的发展和人们生活方式的改变,共享经济和智能化成为了越来越受欢迎的趋势。在这样一个背景下,PHP共享茶室棋牌室无人软硬件结合开发小程序系统的出现,为人们提供了一种全新的娱乐和生活方式。本文将详细介绍PHP共享茶室棋牌室无人软硬…...

kibana监控

采取方式 Elastic Agent :更完善的功能 Metricbeat:轻量级指标收集(采用) 传统收集方法:使用内部导出器收集指标,已不建议 安装 metricbeat Download Metricbeat • Ship Metrics to Elasticsearch | E…...

基于 ARM+FPGA+AD平台的多类型同步信号采集仪开发及试验验证(二)板卡总体设计

2.2 板卡总体设计 本章开发了一款基于 AD7193RJ45 的多类型传感信号同步调理板卡,如图 2.4 所 示,负责将传感器传来的模拟电信号转化为数字信号,以供数据采集系统采集,实现了 单通道自由切换传感信号类型与同步采集多类型传…...

uniapp: 本应用使用HBuilderX x.x.xx 或对应的cli版本编译,而手机端SDK版本是 x.x.xx。不匹配的版本可能造成应用异常。

文章目录 前言一、原因分析二、解决方案2.1、方案一:更新HbuilderX版本2.2、方案二:设置固定的版本2.3、方案三:忽略版本(不推荐) 三、总结四、感谢 前言 项目场景:示例:通过使用HbuilderX打包…...

sqoop和flume简单安装配置使用

1. Sqoop 1.1 Sqoop介绍 Sqoop 是一个在结构化数据和 Hadoop 之间进行批量数据迁移的工具 结构化数据可以是MySQL、Oracle等关系型数据库 把关系型数据库的数据导入到 Hadoop 与其相关的系统 把数据从 Hadoop 系统里抽取并导出到关系型数据库里 底层用 MapReduce 实现数据 …...

什么是React Router?它的作用是什么?

聚沙成塔每天进步一点点 ⭐ 专栏简介 前端入门之旅:探索Web开发的奇妙世界 欢迎来到前端入门之旅!感兴趣的可以订阅本专栏哦!这个专栏是为那些对Web开发感兴趣、刚刚踏入前端领域的朋友们量身打造的。无论你是完全的新手还是有一些基础的开发…...

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向: 逆向设计 通过神经网络快速预测微纳结构的光学响应,替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…...

conda相比python好处

Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理&#xff1a…...

【Linux】shell脚本忽略错误继续执行

在 shell 脚本中,可以使用 set -e 命令来设置脚本在遇到错误时退出执行。如果你希望脚本忽略错误并继续执行,可以在脚本开头添加 set e 命令来取消该设置。 举例1 #!/bin/bash# 取消 set -e 的设置 set e# 执行命令,并忽略错误 rm somefile…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中,手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力,既支持点击、长按、拖拽等基础单一手势的精细控制,也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

1.3 VSCode安装与环境配置

进入网址Visual Studio Code - Code Editing. Redefined下载.deb文件&#xff0c;然后打开终端&#xff0c;进入下载文件夹&#xff0c;键入命令 sudo dpkg -i code_1.100.3-1748872405_amd64.deb 在终端键入命令code即启动vscode 需要安装插件列表 1.Chinese简化 2.ros …...

生成 Git SSH 证书

&#x1f511; 1. ​​生成 SSH 密钥对​​ 在终端&#xff08;Windows 使用 Git Bash&#xff0c;Mac/Linux 使用 Terminal&#xff09;执行命令&#xff1a; ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" ​​参数说明​​&#xff1a; -t rsa&#x…...

NFT模式:数字资产确权与链游经济系统构建

NFT模式&#xff1a;数字资产确权与链游经济系统构建 ——从技术架构到可持续生态的范式革命 一、确权技术革新&#xff1a;构建可信数字资产基石 1. 区块链底层架构的进化 跨链互操作协议&#xff1a;基于LayerZero协议实现以太坊、Solana等公链资产互通&#xff0c;通过零知…...

华硕a豆14 Air香氛版,美学与科技的馨香融合

在快节奏的现代生活中&#xff0c;我们渴望一个能激发创想、愉悦感官的工作与生活伙伴&#xff0c;它不仅是冰冷的科技工具&#xff0c;更能触动我们内心深处的细腻情感。正是在这样的期许下&#xff0c;华硕a豆14 Air香氛版翩然而至&#xff0c;它以一种前所未有的方式&#x…...

20个超级好用的 CSS 动画库

分享 20 个最佳 CSS 动画库。 它们中的大多数将生成纯 CSS 代码&#xff0c;而不需要任何外部库。 1.Animate.css 一个开箱即用型的跨浏览器动画库&#xff0c;可供你在项目中使用。 2.Magic Animations CSS3 一组简单的动画&#xff0c;可以包含在你的网页或应用项目中。 3.An…...