news 2026/6/25 3:23:15

自学嵌入式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/6/25 10:04:58

LobeChat适配LoRA微调模型的方法与注意事项

LobeChat 与 LoRA 微调模型的集成实践&#xff1a;轻量定制化 AI 助手的落地路径 在大模型时代&#xff0c;一个现实而普遍的困境摆在开发者面前&#xff1a;如何让强大的通用语言模型真正“懂”你的业务&#xff1f;比如&#xff0c;你希望它能准确理解公司内部术语、遵循特定…

作者头像 李华
网站建设 2026/6/23 21:32:35

LobeChat能否对接企业微信?组织内AI通知推送实验

LobeChat能否对接企业微信&#xff1f;组织内AI通知推送实验 在智能办公的浪潮中&#xff0c;一个现实问题日益凸显&#xff1a;我们训练有素的AI助手&#xff0c;往往只能“被动应答”&#xff0c;深藏于网页对话框之中。当它分析出一份关键预警或生成了重要报告时&#xff0c…

作者头像 李华
网站建设 2026/6/25 19:10:44

[总结] AI Agent工程师

文章目录基础Prompt EngineerLLMs 调用流式输出Tool Use上下文管理(记忆)、持久化LLM基础进阶MCPRAG向量数据库Query优化检索优化生成优化Agent架构ReAct模式Plan-and-Execute模式&#xff08;适合复杂任务&#xff09;Multi-Agent协作&#xff08;最复杂&#xff09;LangGraph…

作者头像 李华
网站建设 2026/6/25 17:13:53

LobeChat能否实现AI导游?旅游推荐与行程规划助手

LobeChat 能否实现 AI 导游&#xff1f;旅游推荐与行程规划助手 在智能出行日益普及的今天&#xff0c;旅行者不再满足于千篇一律的攻略模板。他们希望获得真正“懂自己”的建议&#xff1a;带孩子的家庭想知道哪些景点推婴儿车最方便&#xff1b;摄影爱好者关心清晨几点到西湖…

作者头像 李华
网站建设 2026/6/25 17:36:54

AI如何帮你生成高效密码字典?

快速体验 打开 InsCode(快马)平台 https://www.inscode.net输入框内输入如下内容&#xff1a; 创建一个密码字典生成工具&#xff0c;能够根据用户输入的关键词、个人信息&#xff08;如生日、姓名等&#xff09;自动生成常见密码组合。支持自定义规则&#xff0c;如长度限制、…

作者头像 李华
网站建设 2026/6/24 22:35:46

无人机产业变革前夜:当飞行器开始“思考”

算法定义硬件的时代&#xff0c;无人机正从飞行平台演变为自主决策系统在森林防火巡查中&#xff0c;无人机不仅能识别火情&#xff0c;还能区分枯树与潜在火情&#xff1b;在城市高空&#xff0c;它可以辨别企业团建与非法聚集&#xff1b;在应急救援中&#xff0c;它能穿越浓…

作者头像 李华