news 2026/4/18 5:42:31

自学嵌入式day32,线程

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
自学嵌入式day32,线程
线程基本概念
  • 线程定义:在 Linux 中,线程属于某个进程,是轻量级的执行单元。每个进程默认有一个主线程,线程间是平级关系。
  • 作用:实现并发执行,提高资源利用率和响应速度。
  • 特征
    • 进程是最小资源分配单位,线程是最小执行单位。
    • 线程共享进程资源(如内存空间),但拥有独立的栈区(通常 8MB)。
    • 稳定性较差:若一个线程崩溃,可能导致整个进程崩溃。
    • 创建开销小:线程创建只需在进程空间中开辟新栈区,而进程创建需分配更多资源(如 3GB 空间)。
    • 并发度高:线程并发优于进程,因为切换成本更低。
线程与进程的区别
  • 资源共享:线程共享进程资源(全局变量、堆等),进程资源独立。
  • 稳定性:进程更稳定(独立地址空间),线程不稳定(共享资源)。
  • 创建开销:线程开销小(仅栈区),进程开销大(完整资源分配)。
  • 并发度:线程并发效率更高,适合高并发场景。
线程编程步骤(POSIX)
  1. 创建线程:使用pthread_create函数。
  2. 线程操作:在线程函数中执行任务。
  3. 资源回收:通过pthread_join或设置分离属性回收资源(避免内存泄漏)。
查看线程信息

在 Linux 终端,可使用以下命令查看线程:

ps -eLf # 显示进程和线程信息 ps -elf # 详细列表
线程相关函数详解

下面逐一解释您列出的函数,并提供代码示例。所有示例基于 C 语言,使用 POSIX 线程库。

  1. 获取线程 ID (pthread_t pthread_self(void))

    • 功能:返回当前线程的 ID(pthread_t类型,通常为unsigned long)。
    • 参数:无。
    • 返回值:成功返回线程 ID,失败返回非零错误码。
    • 示例
      #include <stdio.h> #include <pthread.h> void *thread_func(void *arg) { pthread_t tid = pthread_self(); printf("Thread ID: %lu\n", (unsigned long)tid); pthread_exit(NULL); } int main() { pthread_t tid; pthread_create(&tid, NULL, thread_func, NULL); pthread_join(tid, NULL); return 0; }
  2. 线程退出 (void pthread_exit(void *retval))

    • 功能:线程自行退出,可传递退出状态(如错误码或消息)。
    • 参数retval为退出状态指针(可自定义数据类型)。
    • 返回值:无。
    • 示例
      #include <stdio.h> #include <pthread.h> void *thread_func(void *arg) { printf("Thread exiting...\n"); int *status = malloc(sizeof(int)); *status = 42; // 自定义退出状态 pthread_exit(status); } int main() { pthread_t tid; void *retval; pthread_create(&tid, NULL, thread_func, NULL); pthread_join(tid, &retval); printf("Thread exit status: %d\n", *(int *)retval); free(retval); return 0; }
  3. 请求结束线程 (int pthread_cancel(pthread_t thread))

    • 功能:向指定线程发送取消请求(线程需设置可取消状态)。
    • 参数thread为目标线程 ID。
    • 返回值:成功返回 0,失败返回非零错误码。
    • 示例
      #include <stdio.h> #include <pthread.h> #include <unistd.h> void *thread_func(void *arg) { pthread_setcancelstate(PTHREAD_CANCEL_ENABLE, NULL); while(1) { printf("Thread running...\n"); sleep(1); } pthread_exit(NULL); } int main() { pthread_t tid; pthread_create(&tid, NULL, thread_func, NULL); sleep(3); // 等待 3 秒后取消线程 pthread_cancel(tid); pthread_join(tid, NULL); printf("Thread canceled.\n"); return 0; }
  4. 线程资源回收 (int pthread_join(pthread_t thread, void **retval))

    • 功能:阻塞等待指定线程结束并回收资源(栈、状态等)。
    • 参数
      • thread:目标线程 ID。
      • retval:接收线程退出状态(需匹配pthread_exit的返回值)。
    • 返回值:成功返回 0,失败返回非零错误码。
    • 示例:见以上pthread_exit示例。
  5. 设置分离属性 (int pthread_detach(pthread_t thread))

    • 功能:设置线程为分离状态,退出后系统自动回收资源(无需pthread_join)。
    • 参数thread为目标线程 ID(通常线程自身调用)。
    • 返回值:成功返回 0,失败返回非零错误码。
    • 示例
      #include <stdio.h> #include <pthread.h> void *thread_func(void *arg) { pthread_detach(pthread_self()); // 设置自身为分离状态 printf("Detached thread running.\n"); pthread_exit(NULL); } int main() { pthread_t tid; pthread_create(&tid, NULL, thread_func, NULL); sleep(1); // 主线程短暂等待 printf("Main thread continues.\n"); return 0; // 分离线程资源由系统回收 }
完整示例:线程创建与回收

以下程序展示创建多个线程、使用共享资源,并回收资源:

#include <stdio.h> #include <pthread.h> #define NUM_THREADS 3 void *worker(void *arg) { int thread_num = *(int *)arg; printf("Thread %d started. ID: %lu\n", thread_num, (unsigned long)pthread_self()); pthread_exit(NULL); } int main() { pthread_t threads[NUM_THREADS]; int thread_args[NUM_THREADS]; // 创建线程 for (int i = 0; i < NUM_THREADS; i++) { thread_args[i] = i; if (pthread_create(&threads[i], NULL, worker, &thread_args[i]) != 0) { perror("pthread_create error"); return 1; } } // 回收线程资源 for (int i = 0; i < NUM_THREADS; i++) { pthread_join(threads[i], NULL); } printf("All threads completed.\n"); return 0; }
注意事项
  • 资源管理:避免内存泄漏,确保回收线程资源(使用pthread_join或设置分离属性)。
  • 线程安全:共享资源时需用互斥锁(如pthread_mutex)防止竞态条件。
  • 错误处理:检查函数返回值,使用perrorstrerror诊断错!
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/17 14:08:03

零基础入门:VSCode和Anaconda的Python开发环境搭建

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个新手友好的Python项目&#xff0c;指导用户安装和配置VSCode与Anaconda。项目应包括环境设置、扩展安装和第一个“Hello World”程序。AI应提供逐步指导&#xff0c;并解答…

作者头像 李华
网站建设 2026/4/17 17:46:42

如何进行微信个人号API二次开发?

在私域流量成为企业“救命稻草”的今天&#xff0c;微信早已不仅是聊天工具&#xff0c;而是价值万金的商业阵地。然而&#xff0c;现实往往很残酷&#xff1a;人力成本高&#xff1a; 员工每天耗费数小时在加好友、拉群、发朋友圈等重复劳动上。响应速度慢&#xff1a; 咨询量…

作者头像 李华
网站建设 2026/4/16 10:54:40

LobeChat能否实现AI宇航员?深空探测任务辅助决策系统

LobeChat能否实现AI宇航员&#xff1f;深空探测任务辅助决策系统 在火星轨道飞行器与地球之间&#xff0c;一次简单的通信可能需要22分钟往返。这意味着&#xff0c;当宇航员在舱内发现氧气浓度异常时&#xff0c;等待地面指挥中心分析数据、制定方案、发送指令的过程&#xf…

作者头像 李华
网站建设 2026/4/14 4:25:03

AI智能诊断:一键解决Docker重启失败的烦恼

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个AI辅助的Docker故障诊断工具&#xff0c;能够自动分析Docker重启失败的原因。功能包括&#xff1a;1. 读取Docker日志和系统日志&#xff1b;2. 使用AI模型&#xff08;如K…

作者头像 李华
网站建设 2026/4/17 6:24:09

用PlotJuggler快速验证你的数据可视化创意

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 开发一个快速原型模板&#xff0c;功能包括&#xff1a;1. 拖拽式UI设计数据可视化看板&#xff1b;2. 预设常见图表模板&#xff08;折线图、柱状图等&#xff09;&#xff1b;3. …

作者头像 李华