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

自学嵌入式第二十九天:Linux系统编程-线程

一、线程

        1.线程是轻量级进程,一般是一个进程中的多个任务;

        2.比多进程节省资源,可以共享变量;

        3.进程是系统中最小的资源分配单位,线程是系统中最小的执行单位;

        4.进程里会自动启动主线程(main_thread);

        5.特征:

                (1)只有独立栈区,其他全部共享,共享资源;

                (2)效率高30%;

                (3)三方库:pthread clone posix

                        编写时添加头文件,pthread.h

                        编译时,-lpthread library

                        库文件:libpthread.so

        6.缺点

                (1)比进程稳定性要差;

                (2)gdb相对麻烦;

二、进程与线程

        1.共同点:并发;

        2.不同点

                (1)创建的开销,proc 3G,thread 8M;

                (2)proc数据不共享,thread除了栈区数据共享;

                (3)稳定性:proc稳定,thread不稳定;

                (4)proc(大任务),thread(大任务中需要并发的小任务);

                (5)线程属于某个进程;

三、线程的编程

        1.创建线程

        int pthread_create(pthread_ *thread,const pthread_attr_t *attr,void *(*start routine)(void*),void *arg);

        成功返回0;错误返回非零的错误号;

        2.获得当前线程的线程号

        pthread_t pthread_self();

        %lu,线程号的类型是unsigned long;

        返回值是线程号(内核层);

        3.ps eLf 查看用户层的线程号

        ps -eLo pid,ppid,lwp,stat,comm指定显示的内容

        4.退出当前线程

        void pthread_exit(void* retval);

        如果在线程里调用exit则会结束所有线程;

        5.结束一个线程

        int pthread_cancle(pthread_t thread);

        一般是其它线程关闭另一个线程;

        6.回收

        主线程不能先结束;

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

        thread是要回收的子线程tid;

        retval是接收的子线程的返回值/状态,返回值如果是个int型,就需要提前指定一个int指针,把指针取地址放入;

        阻塞等待;

        7.设置分离属性

        目的线程消亡自动回收空间;

        int pthread_detach(pthread_t thread);

        8.线程清理函数

        void pthread_cleanup_push(void(*routine)(void*),void *arg);

        注册一个清理函数routine;

        void pthread_cleanup_pop(int execute);

        execute为真时调用清理函数;

        类似于do{}while();

        

http://www.xdnf.cn/news/1376839.html

相关文章:

  • flume监控文件写入 Kafka 实战:解耦应用与消息队列的最佳实践
  • 在语言模型监督式微调(SFT)中的 负对数似然(Negative Log-Likelihood, NLL)等价于最大化似然
  • 软考-系统架构设计师 管理信息系统(MIS)详细讲解
  • 为什么编码智能体可以重塑开发范式?
  • 【Mascaret】QGIS中Mascaret插件的使用
  • ESP8266:Arduino学习
  • 高并发内存池(12)-ThreadCache回收内存
  • 【HTML】隐藏滚动条但保留功能
  • 什么是AI+?什么是人工智能+?
  • redis---set详解
  • ICCV 2025 | 清华IEDA提出GUAVA,单图创建可驱动的上半身3D化身!实时、高效,还能捕捉细腻的面部表情和手势。
  • 《MongoDB 常用命令详解:从数据库操作到高级查询》
  • Windows/Linux 环境下 Jmeter 性能测试的安装与使用
  • 未成功:使用 Nginx 搭建代理服务器(正向代理 HTTPS 网站)
  • Linux学习-TCP并发服务器构建
  • 在 Windows 上部署 Go 语言开发环境
  • 数据分析编程第五步:数据准备与整理
  • JoyAgent-JDGenie开源多智能体系统详解:架构、部署与企业级应用案例
  • 5G NR学习笔记 预编码(precoding)和波束赋形(beamforming)
  • 嵌入式第三十九天(TCP多任务并发)
  • QT应用层项目20250822
  • MAX系列FPGA型号对比及低功耗特性分析
  • 【Linux 小实战】自定义 Shell 的编写
  • 把CentOS 7默认yum源改成腾讯云镜像
  • 移动端(微信等)使用 vConsole调试console
  • Web漏洞
  • Vue-24-利用Vue3的element-plus库实现树形结构数据展示
  • 一文详解 LangChain4j AiServices:自动代理实现大模型交互
  • 【datawhale组队学习】RAG技术 -TASK05 向量数据库实践(第三章3、4节)
  • 如何使用windows实现与iphone的隔空投送(AirDrop)