Linux7-线程
一、前情回顾
| chdir(); |
| 功能: 函数用于改变当前进程的工作目录。 |
| 参数:路径(Path):这是一个字符串参数,表示要切换到的目标目录的路径。 |
| 返回值: 成功:在成功改变当前工作目录时, 失败:如果因为某些原因(如路径不存在、权限不足等)无法改变目录, |
二、线程
轻量级进程 线程是cpu任务调度的最小单位
1.线程的创建
线程由某个进程创建,从属于某个进程。
1.1内容:
由所在进程为其分配独立的的栈区空间(默认8M),其他空间(堆区、数据区、文本区)共享给所有线程,内核存储线程控制块。

1.2特点:
线程是cpu任务调度的最小单位
进程是操作系统资源分配的最小单位
1.3线程与进程的区别:
1.线程是cpu任务调度的最小单位
进程是操作系统资源分配的最小单位
2.线程是一个轻量级的进程,所在进程为其分配独立的栈区空间
3.资源消耗:进程>线程
4.效率角度:线程的创建速度>进程 线程任务切换>进程
5.安全角度:多进程>多线程 各个进程相互独立,线程资源共享
6.通信角度:多线程>多进程 线程间数据共享更方便,进程是独立的需要使用进程间通信的通信方法。
2.线程的调度
宏观并行,微观串行
操作系统调度
3.线程的消亡
3.1线程的消亡
3.2回收线程
return , pthread_exit()
4.编程:
#include <pthread.h>
编译链接 -pthread
| int pthread_create(pthread t *thread, const pthread_attr_t *attr,void *(*start routine)(void*),void *arg); |
| 功能:创建一个线程在被调的进程中 |
| 参数: pthread t *thread:保存线程ID的变量的地址 const pthread_attr_t *attr:设置线程属性对象的地址 NULL:按照线程默认属性去创建 void *(*start routine)(void*):回调函数:线程启动后需要执行的任务的入口地址 void *arg:作为回调函数的参数被传参。 |
| 返回值: 成功:=0 失败:!0 |
| pthread_t pthread_self(void); |
| 功能:获得线程的tid号 |
| 返回值: 总是成功:tid |
| int pthread_join(pthread_t thread,void **retval); |
| 功能:阻塞等待回收线程资源(回收非分离属性的线程) |
| 参数: thread:需要回收的线程tid retval: 线程退出时,传递给回收线程的参数 |
| 返回值: 成功:0 失败:!0 |
| void pthread_exit(void*retval); |
| 功能:退出一个线程 |
| 参数:指向返回值的指针 |
对于创建线程的进程,无合适机会回收线程资源时,可以将线程设置成具有分离属性的线程。
线程属性:
线程的分离属性:线程结束时,不需要其他线程回收,会被操作系统自动回收。//孤儿进程
线程的非分离属性:可以被其他线程回收或者结束。pthread_join或者结束 //僵尸进程
设置线程的分离属性:
1.定义线程属性对象 pthread_attr attr
2.初始化线程属性对象 int pthread_attr_init(pthread_attr_t *attr)
3.设置线程的分离属性 int pthread_attr_setdetachstate(pthread_attr_t *attr, int detachstate)
PTHREAD_CREATE_DETACHED
4.以分离属性创建线程 int pthread_create(..., const pthread_attr_t *attr,...);
5.销毁线程属性对象 int pthread_attr_destroy(pthread_attr_t *attr)
5.线程之间的通信
通过pthread_create给线程任务传参
int num=10;
pthread_create(,,,&num);void *fun(void *arg)
{int fnum =*(int *)arg;
}
全局变量的方式线程间通信
三、补充
1. 函数指针
一个指向函数的指针
2. 函数指针定义:
函数 : void fun(int a, int b);
函数返回值类型 (*指针名称)(函数的形参表);
定义了一个叫做"指针名称"函数指针。
指针:void (*pfun)(int , int);
3. 给函数指针赋值:
初始化:
void (*pfun)(int , int) = fun;//int *p = &a;
赋值:
void (*pfun)(int , int); // int *p;
pfun = fun; // p = &a;
4. 函数指针数组
把多个函数的地址组织存储在一个数组中
定义一个指针数组:
char * arg[5] = {NULL};
函数指针数组:
void (*arg[5])(int, int);
对数组进行初始化:
void (*arg[])(int, int) = {fun, fun1, fun2} ;
通过typedef重命名函数指针类型:
typedef int U32;
函数指针类型:void (*)(int , int); // int *;
typedef void (*Pfun_t)(int , int);
将函数指针类型重命名成Pfun_t类型
Pfun_t arr[5];
函数指针数组:
把多个函数的地址组织存储在一个数组中
定义一个指针数组:
char * arg[5];定义一个函数指针数组; 对函数指针数组初始化:
void (*argv[])(int ,int); void (*argv[5])(int ,int)={fun,fun1,fun2……};
通过typedef重命名函数指针类型:
typedef int U32;
函数指针类型:void (*)(int ,int);
typedef voidun_t)(int ,int)//将函数指针类型重命名成Pfun_t类型
相关文章:
Linux7-线程
一、前情回顾 chdir();功能: 函数用于改变当前进程的工作目录。 参数:路径(Path):这是一个字符串参数,表示要切换到的目标目录的路径。 返回值: 成功:在成功改变当前工作目…...
在线VS离线TTS(语音合成芯片)有哪些优势-AIOT智能语音产品方案
离线 TTS 存在语音质量欠佳、音色选择有限、语言支持单一更新困难、占用资源多、适应性差、难以个性化定制等痛点 01更新维护困难 由于是离线模式,难以及时获取最新的语音数据和算法更新,无法得到持续改进。 02占用本地资源 需要在设备本地存储较大的…...
结构型模式 - 代理模式 (Proxy Pattern)
结构型模式 - 代理模式 (Proxy Pattern) 代理模式是一种结构型设计模式,它允许通过代理对象来控制对另一个对象(目标对象)的访问。代理对象充当目标对象的接口,客户端通过代理对象间接访问目标对象。 分为两大类 静态代理&#…...
el-select滚动获取下拉数据;el-select滚动加载
el-select下拉获取数据 1.解决问题2.封装MyScrollSelect组件3.使用MyScrollSelect组件 1.解决问题 场景:下拉数据量过大,后端提供一个分页查询接口;需要每次滚动加载下一页的下拉数据 且单选的状态,需要支持回显,通过n…...
HTTP GET 请求示例
鸿蒙操作系统(HarmonyOS)是华为公司自主研发的面向全场景的分布式操作系统,旨在为用户提供一个安全、流畅且跨设备无缝连接的体验。它支持多种终端设备,如智能手机、平板电脑、智能电视、汽车等,并实现了模块化解耦&am…...
简单理解Oracle中的latch
可以用一个小卖部抢购的例子来理解 Oracle 数据库中的 Latch: 1、 什么是 Latch? 打个比方,假设数据库的某个内存区域(比如缓存的数据块)是小卖部货架上的最后一包辣条,Latch 就像是货架前的一个狭窄通道&a…...
ubuntu新系统使用指南
1. 更新源 2. 配置rime 输入法 sudo apt install ibus-rimeibus-setup #打开配置界面添加雾凇拼音 cd ~/Documents/Tool/input_source/plumgit clone --depth 1 https://github.com/rime/plum plum #没有梯子就劝退cd plum/bash rime-install iDvel/rime-ice:others/recipe…...
sage-huga改进SITAN
Sage-Husa自适应滤波算法 Sage-Husa自适应滤波算法是一种在递推滤波过程中实时估计和修正系统噪声和观测噪声统计特性的算法,从而降低系统模型误差,提高滤波精度。该算法基于卡尔曼滤波,并通过自适应调整噪声协方差矩阵来优化滤波效果。 算法原理 Sage-Husa滤波器的核心思…...
DeepSeek开源周Day1:FlashMLA引爆AI推理性能革命!
项目地址:GitHub - deepseek-ai/FlashMLA 开源日历:2025-02-24起 每日9AM(北京时间)更新,持续五天! 一、开源周震撼启幕 继上周预告后,DeepSeek于北京时间今晨9点准时开源「FlashMLA」,打响开源周五连…...
Git add --- error: Filename too long
0 Preface/Foreword 1 解决办法 git config --system core.longpaths true...
Python入门12:面向对象的三大特征与高级特性详解
面向对象编程(OOP)是Python编程中非常重要的一部分,它通过封装、继承和多态这三大特征,帮助我们更好地组织和管理代码。除此之外,Python还提供了一些其他特性,如类属性、类方法和静态方法,进一步…...
动态链接器(九):.init和.init_array
ELF文件中的.init和.init_array段是程序初始化阶段的重要组成部分,用于在main函数执行前完成必要的初始化操作。 1 .init段和.init_array 段 1.1 作用 .init段包含编译器生成的初始化代码,通常由运行时环境(如C标准库的启动例程࿰…...
Elasticsearch:使用经过训练的 ML 模型理解稀疏向量嵌入
作者:来自 Elastic Dai Sugimori 了解稀疏向量嵌入,理解它们的作用/含义,以及如何使用它们实现语义搜索。 Elasticsearch 提供语义搜索功能,允许用户使用自然语言进行查询并检索相关信息。为此,目标文档和查询必须首先…...
安宝特方案 | 电力行业的“智能之眼”,AR重新定义高效运维!
引言: 电力行业正经历智能化变革,安宝特AR数字化工作流以四大核心优势,为电力企业打造全场景智慧运维方案! 四大颠覆性功能,直击行业痛点 1、高度自定义作业流程 支持图文指引、语音播报、AI实时识别(如…...
【落羽的落羽 数据结构篇】树、二叉树
文章目录 一、树1. 树的概念和结构2. 树的相关术语 二、二叉树1. 概念与结构2. 满二叉树3. 完全二叉树4. 二叉树的性质5. 二叉树的存储结构 一、树 1. 树的概念和结构 之前我们学习了线性表,今天我们再来接触一种全新的数据结构——树。 树是一种非线性的数据结构…...
[回顾]从原型链视角解读Vue底层实现Vue VueCompoent VM VC关系
从原型链视角解读VueComponent与Vue关系 原型链 根据,原型链涉及三个关键属性:__proto__是所有对象的私有属性,指向原型链的第一个元素;prototype是函数的属性,实例对象不拥有它;constructor指向构造函数。提到原型链是JS中实现继承的机制,通过属性链式查找属性,直到…...
springcloud nacos 整合seata解决分布式事务
文章目录 nacos安装Mysql5.7安装及表初始化seata server安装下载并解压seata安装包在conf文件夹修改file.conf文件向本地数据库导入seata需要的表修改registry.conf文件将seata配置信息添加到nacos配置中心启动seata server springcloud整合seata测试流程正常下单流程扣减库存失…...
【算法系列】快速排序详解
文章目录 快速排序的多种实现方式1. 基本快速排序(Lomuto 分区方案)1.1 基本原理1.2 步骤1.3 Java 实现示例 2. Hoare 分区方案2.1 基本原理2.2 步骤2.3 Java 实现示例 3. 三数取中法3.1 基本原理3.2 步骤3.3 Java 实现示例 4. 尾递归优化4.1 基本原理4.…...
神经网络发展简史:从感知机到通用智能的进化之路
引言 神经网络作为人工智能的核心技术,其发展历程堪称一场人类对生物大脑的致敬与超越。本文将用"模型进化"的视角,梳理神经网络发展的五大关键阶段,结合具象化比喻和经典案例,为读者呈现一幅清晰的AI算法发展图谱。 一…...
C语言番外篇(4)--------->goto语句
在C语言中,有一个很特殊的语法,这就是goto语句。goto用于实现同一函数的跳转,goto后面会有一个标志,执行goto语句时,就会跳转到标志的位置。 一、goto语句的语法 (1)goto在前,标志…...
Flask RESTful 示例
目录 1. 环境准备2. 安装依赖3. 修改main.py4. 运行应用5. API使用示例获取所有任务获取单个任务创建新任务更新任务删除任务 中文乱码问题: 下面创建一个简单的Flask RESTful API示例。首先,我们需要创建环境,安装必要的依赖,然后…...
高等数学(下)题型笔记(八)空间解析几何与向量代数
目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...
selenium学习实战【Python爬虫】
selenium学习实战【Python爬虫】 文章目录 selenium学习实战【Python爬虫】一、声明二、学习目标三、安装依赖3.1 安装selenium库3.2 安装浏览器驱动3.2.1 查看Edge版本3.2.2 驱动安装 四、代码讲解4.1 配置浏览器4.2 加载更多4.3 寻找内容4.4 完整代码 五、报告文件爬取5.1 提…...
Hive 存储格式深度解析:从 TextFile 到 ORC,如何选对数据存储方案?
在大数据处理领域,Hive 作为 Hadoop 生态中重要的数据仓库工具,其存储格式的选择直接影响数据存储成本、查询效率和计算资源消耗。面对 TextFile、SequenceFile、Parquet、RCFile、ORC 等多种存储格式,很多开发者常常陷入选择困境。本文将从底…...
HashMap中的put方法执行流程(流程图)
1 put操作整体流程 HashMap 的 put 操作是其最核心的功能之一。在 JDK 1.8 及以后版本中,其主要逻辑封装在 putVal 这个内部方法中。整个过程大致如下: 初始判断与哈希计算: 首先,putVal 方法会检查当前的 table(也就…...
视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
MinIO Docker 部署:仅开放一个端口
MinIO Docker 部署:仅开放一个端口 在实际的服务器部署中,出于安全和管理的考虑,我们可能只能开放一个端口。MinIO 是一个高性能的对象存储服务,支持 Docker 部署,但默认情况下它需要两个端口:一个是 API 端口(用于存储和访问数据),另一个是控制台端口(用于管理界面…...
DBLP数据库是什么?
DBLP(Digital Bibliography & Library Project)Computer Science Bibliography是全球著名的计算机科学出版物的开放书目数据库。DBLP所收录的期刊和会议论文质量较高,数据库文献更新速度很快,很好地反映了国际计算机科学学术研…...
如何在Windows本机安装Python并确保与Python.NET兼容
✅作者简介:2022年博客新星 第八。热爱国学的Java后端开发者,修心和技术同步精进。 🍎个人主页:Java Fans的博客 🍊个人信条:不迁怒,不贰过。小知识,大智慧。 💞当前专栏…...
