当前位置: 首页 > 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.dtcms.com/a/353003.html

相关文章:

  • 零后端、零配置:用 AI 编程工具「Cursor」15 分钟上线「Vue3 留言墙」
  • 从“找不到”到“秒上手”:金仓文档系统重构记
  • 深度学习-----详解MNIST手写数字数据集的神经网络实现过程
  • Linux系统使用ADB同时连接多个Android设备
  • 一、Mac(M1)本地通过docker安装Dify
  • 【Day 35】Linux-主从复制的维护
  • C语言中的static vs C++中的static:相同关键字,不同境界
  • golang13 单元测试
  • KingBase数据库迁移利器:KDTS工具 MySQL数据迁移到KingbaseES实战
  • uniapp中 ios端 scroll-view 组件内部子元素z-index失效问题
  • 大数据毕业设计选题推荐-基于大数据的城市空气污染数据分析系统-Spark-Hadoop-Bigdata
  • Elasticsearch三大属性详解:enabled、index与store
  • 【问题思考】为什么SVM中的w和超平面是垂直的?【SVM】【gemini生成】
  • Web转uni-app
  • 支持向量机(SVM)学习总结
  • 本地搭建 Redis/MySQL 并配置国内镜像加速(Docker/原生安装 | macOS/Linux/Windows)
  • Python爬虫实战:构建网易云音乐个性化音乐播放列表同步系统
  • 直线拟合方法全景解析:最小二乘、正交回归与 RANSAC
  • 3.【鸿蒙应用开发实战: 从入门到精通】开发入门 Hello World
  • Linux程序管理
  • SyntaxError: Failed to execute ‘open‘ on ‘XMLHttpRequest‘: Invalid URL
  • Mybatis总结
  • 织梦会员中心模板调用某个栏目名和栏目下文档的办法
  • 神经网络学习笔记11——高效卷积神经网络架构SqueezeNet
  • SCANeR Studio 仿真数据获取和车辆座舱数据输入-手自动驾驶切换(二)
  • 混合RAG架构:下一代企业级检索增强生成的融合之道
  • AI-Agent 深度科普:从概念到架构、应用与未来趋势
  • 【软考架构】软件架构复用的过程
  • 2025年- H100-Lc208--912.排序数组(快速选择排序)--Java版
  • k8s-容器化部署论坛和商城服务