Linux 操作系统线程

embedded/2024/10/11 13:19:55/

目录

一、线程

1.1线程的基本概念

1.2 线程相关的API函数

1.2.1  线程的创建

1.2.2  线程退出

1.2.3  线程等待函数

1.2.4  获取线程ID

1.2.5 线程取消

1.2.6 线程的清理函数


一、线程

1.1线程的基本概念

线程是属于进程;一个进程可以有多个线程;

线程的作用就是:解决多任务并发运行

进程和线程的区别:
        1.和进程相比, 它是一种非常“节俭” 的多任务操作方式( 启动一个进程所花费的空间
远远大于启动一个线程所花费的空间( 30 倍左右) , 而且, 线程间彼此切换所需的时间也远小于进程间切换所需要的时间( >10 倍) ) 。 在 linux 系统中建立一个新的进程必须分配给它独立的地址空间, 建立众多的数据表来维护它的代码段、 堆栈段和数据段等。 而运行于同一个进程的多个线程, 它们之间使用相同的地址空间, 而且线程间彼此切换所需的时间也远小于进程间切换的时间。

        2.线程间方便的通信机制。 对于不同进程,它们有独立的数据空间 数据的交互只能使
用进程通信 的方式, 这种方式费时, 而且不方便。 但是同一个进程下的线程之间共享数据空间, 所以一个线程的数据可 以直接为其他线程所有, 快捷, 方便。

线程的缺点:一个线程的非正常死亡,会导致进程退出,进而所有的线程均会死亡。

线程和进程在使用上各有优缺点:

        线程执行开销小, 占用的 CPU 资源少, 线程之间的切换快,但不利于资 源的管理和保护; 而进程正相反。 从可移植性来讲, 多进程的可移植性要好些。 要注意的是 由于线程共享了进 程的资源和地址空间, 因此, 任何线程对系统资源的操作都会给其他线程带来影响, 同时编写多线程程序, 最复 杂的事情是处理好各线程对共享资源的访问控制。

如何选择使用进程和线程:

        1) 需要频繁创建销毁的优先用线程,因为对进程来说创建和销毁一个进程代价是很大的。
        2)线程的切换速度快, 所以在需要大量计算, 切换频繁时用线程, 还有耗时的操作使用线程可高应用程序的响应;
        3) 强相关的处理用线程, 弱相关的处理用进程;
        4) 因为对 CPU 系统的效率使用上线程更占优, 所以可能要发展到多机分布的用进程, 多核分用线程;
        5) 需要更稳定安全时, 适合选择进程; 需要速度时, 选择线程更好。
        6) 如果线程和进程都各有优势和劣势, 选你喜欢的/你擅长的

1.2 线程相关的API函数

在wubantul inux操作系统上使用线程库函数需要进行调用,

gcc main -o main -lpthread

1.2.1  线程的创建

头文件:#include<pthread.h>

函数原型:

int pthread_create(pthread_t *restrict_thread, //线程号 %luconst pthread_attr_t *restrict_attr, //NULLvoid *(*start_routine)(void*), //函数指针, 传函数名即可void *restrict arg); //传给上一个参数的参数

参数:

        线程ID  //unsigned long

        线程属性  //  NULL

        线性入口函数

        传递给线程入口函数的参数

返回值:

成功返回0    失败返回错误号(非0)

1.2.2  线程退出

头文件:#include<pthread.h>

函数原型:

void pthread_exit(void *value_ptr);

参数:保存线程退出的状态

1.2.3  线程等待函数

头文件:#include<pthread.h>

函数原型:

int pthread_join(pthread_t thread, void **value_ptr);

作用:等待指定的线程退出,该函数是一个阻塞函数,一直等到参数pthid指定的线程返回;与多进程中的wait 或 waitpid 类似

参数:

要等待的线程ID

保存线程退出的状态 一般指定NULL

返回值:成功返回0,失败返回非0

1.2.4  获取线程ID

函数原型:

pthread_t pthread_self(void)

返回值:线程号,不同的线程有不同的线程号,但是线程号是相同的

1.2.5 线程取消

作用:取消一个还没有运行完的线程

函数原型:

int pthread_cancel(pthread_t thread);

参数:thread: 线程号

1.2.6 线程的清理函数

作用:有时候希望线程退出时能自动的执行某些函数

函数原型:

void pthread_cleanup_push(void (*routine)(void*), void *arg); 是清理注册函数
void pthread_cleanup_pop(int execute);是执行函数, 只有里面的参数 execute=1 才会执行

注意:这两个函数都是成双成对出现的,不能单独使用。

参数:

        routine: 注册清理的函数的指针
        arg: 传递给清理函数的参数
        execute: 决定这个清理函数是否被调用
        有三种情况线程清理函数会被调用:
                线程还未执行 pthread_cleanup_pop 前, 被 pthread_cancel 取消
                线程还未执行 pthread_cleanup_pop 前, 主动执行 pthread_exit 终止
                线程执行 pthread_cleanup_pop, 且 pthread_cleanup_pop 的参数为 1

线程的清理函数中的顺序和栈一样,满足先后出。


http://www.ppmy.cn/embedded/34805.html

相关文章

前端面试题(二)

面试形式&#xff1a;线上面试&#xff08;不露脸&#xff09;&#xff1a;时长40分钟 面试评价&#xff1a;由易到难&#xff0c;由细到全&#xff0c;比较不错 面试官&#xff1a;项目经理 面试官提问&#xff08;面试题&#xff09;&#xff1a; 1、聊聊最近写的这个项目…

同创优配正规股票港股市场炒股加仓!中国资产,火了

查查配近日,受国内利好政策不断、全球资金对中国市场信心提升等多重因素影响,市场风险偏好明显上升,A股、港股市场均表现强劲,上证指数站上3100点,恒生指数也上演九连阳,创下2018年以来的最长连涨纪录。从资金动向来看,机构加仓明显,北向资金持续净买入,A股ETF也被大幅加仓,部分…

学习中遇到的问题

1.UFUNCTION() 不是所有函数都能加UFUNCTION()修饰&#xff0c;涉及UE反射机制。 2.初始化用{} 初始化列表 3.创建C文件时修改了路径 这时.cpp文件会报错&#xff0c;只需删掉前面多余路径即可 4.函数的移除 1.虚幻5.1 UUserWidget不再包含OnLevelRemovedFromWorld() 转而使用…

Vue前端环境准备

vue-cli Vue-cli是Vue官方提供的脚手架&#xff0c;用于快速生成一个Vue项目模板 提供功能&#xff1a; 统一的目录结构 本地调试 热部署 单元测试 集成打包上线 依赖环境&#xff1a;NodeJs 安装NodeJs与Vue-Cli 1、安装nodejs&#xff08;已经安装就不用了&#xff09; node-…

[LitCTF 2023]Ping、[SWPUCTF 2021 新生赛]error、[NSSCTF 2022 Spring Recruit]babyphp

[LitCTF 2023]Ping 尝试ping一下127.0.0.1成功了&#xff0c;但要查看根目录时提示只能输入IP 查看源代码&#xff0c;这段JavaScript代码定义了一个名为check_ip的函数&#xff0c;用于验证输入是否为有效的IPv4地址。并且使用正则表达式re来匹配IPv4地址的格式。 对于这种写…

笔记---DFS,深度优先搜索

深度优先搜索乃是注重深度&#xff0c;会把一条路径优先全部搜完然后再去回溯&#xff0c;再去搜其他路径 连通性模型 与BFS中的Flood Fill相似 AcWing.1112.迷宫 一天Extense在森林里探险的时候不小心走入了一个迷宫&#xff0c;迷宫可以看成是由 n∗n 的格点组成&#xff…

我独自升级崛起下载教程 我独自升级崛起一键下载

动作RPG游戏基于广大喜爱的动画和在线漫画《我独自升级崛起》在5月8日&#xff0c;这款新的游戏首次在全球亮相&#xff0c;意在给那些对游戏情有独钟的玩家带来更加丰富和多种多样的游戏体验。这个网络武侠题材的游戏设计非常具有创意&#xff0c;其主要故事围绕着“独孤求败”…

【算法系列】栈

目录 leetcode题目 一、删除字符串中的所有相邻重复项 二、比较含退格的字符串 三、基本计算器 II 四、字符串解码 五、验证栈序列 六、有效的括号 七、最小栈 八、逆波兰表达式求值 九、用栈实现队列 十、用队列实现栈 leetcode题目 一、删除字符串中的所有相邻重…