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在前,标志…...

无法与IP建立连接,未能下载VSCode服务器
如题,在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈,发现是VSCode版本自动更新惹的祸!!! 在VSCode的帮助->关于这里发现前几天VSCode自动更新了,我的版本号变成了1.100.3 才导致了远程连接出…...

376. Wiggle Subsequence
376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装
以下是基于 vant-ui(适配 Vue2 版本 )实现截图中照片上传预览、删除功能,并封装成可复用组件的完整代码,包含样式和逻辑实现,可直接在 Vue2 项目中使用: 1. 封装的图片上传组件 ImageUploader.vue <te…...

c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)
1.获取 authorizationCode: 2.利用 authorizationCode 获取 accessToken:文档中心 3.获取手机:文档中心 4.获取昵称头像:文档中心 首先创建 request 若要获取手机号,scope必填 phone,permissions 必填 …...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...

微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据
微软PowerBI考试 PL300-在 Power BI 中清理、转换和加载数据 Power Query 具有大量专门帮助您清理和准备数据以供分析的功能。 您将了解如何简化复杂模型、更改数据类型、重命名对象和透视数据。 您还将了解如何分析列,以便知晓哪些列包含有价值的数据,…...

以光量子为例,详解量子获取方式
光量子技术获取量子比特可在室温下进行。该方式有望通过与名为硅光子学(silicon photonics)的光波导(optical waveguide)芯片制造技术和光纤等光通信技术相结合来实现量子计算机。量子力学中,光既是波又是粒子。光子本…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...