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

【嵌入式八股5】C++:多线程相关

1. 线程创建与管理

1.1 pthread_create
  • 功能: 创建一个新的线程,并指定该线程的执行函数。
  • 参数:
    • pthread_t *thread: 指向线程标识符的指针。
    • const pthread_attr_t *attr: 线程属性,通常为 NULL
    • void *(*start_routine)(void *): 线程执行的函数指针。
    • void *arg: 传递给线程函数的参数。
  • 返回值: 成功返回 0,失败返回错误码。
  • 示例:
    #include <pthread.h>
    #include <iostream>void* threadFunc(void* arg) {std::cout << "Thread is running!" << std::endl;return NULL;
    }int main() {pthread_t thread;if (pthread_create(&thread, NULL, threadFunc, NULL) != 0) {std::cerr << "Failed to create thread!" << std::endl;return 1;}pthread_join(thread, NULL);return 0;
    }
    
1.2 pthread_join
  • 功能: 主线程等待指定线程终止,并回收其资源。
  • 参数:
    • pthread_t thread: 要等待的线程标识符。
    • void **retval: 存储线程返回值的指针,可以为 NULL
  • 返回值: 成功返回 0,失败返回错误码。
  • 注意: 如果不调用 pthread_join,线程资源可能无法释放,导致内存泄漏。
1.3 pthread_detach
  • 功能: 将线程设置为分离状态,线程终止后自动释放资源。
  • 参数:
    • pthread_t thread: 要分离的线程标识符。
  • 返回值: 成功返回 0,失败返回错误码。
  • 注意: 分离后的线程无法被 pthread_join 等待。
1.4 pthread_cancel
  • 功能: 请求取消指定线程。
  • 参数:
    • pthread_t thread: 要取消的线程标识符。
  • 返回值: 成功返回 0,失败返回错误码。
  • 注意: 线程取消是异步的,线程可能不会立即终止。
1.5 pthread_equal
  • 功能: 比较两个线程标识符是否相等。
  • 参数:
    • pthread_t t1: 第一个线程标识符。
    • pthread_t t2: 第二个线程标识符。
  • 返回值: 相等返回非零值,否则返回 0。

2. 进程管理

2.1 fork()
  • 功能: 创建一个新进程,新进程是调用进程的子进程。
  • 返回值:
    • 在父进程中返回子进程的 PID。
    • 在子进程中返回 0。
    • 失败返回 -1。
  • 示例:
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>int main() {int pid = fork();if (pid < 0) {fprintf(stderr, "Fork Failed!");exit(-1);} else if (pid == 0) {printf("This is Child Process!\n");} else {printf("This is Parent Process!\n");wait(NULL);printf("Child Complete!\n");}return 0;
    }
    
2.2 孤儿进程
  • 定义: 父进程先于子进程退出,子进程由 init 进程接管。
  • 特点: 无害,内核会自动回收资源。
2.3 僵尸进程
  • 定义: 子进程退出后,父进程未调用 wait() 或 waitpid() 回收资源,导致子进程的 PCB 仍存在于内核中。
  • 危害: 占用系统资源,可能导致系统资源耗尽。
  • 解决方案:
    • 父进程调用 wait() 或 waitpid() 回收子进程资源。
    • 杀死父进程,使僵尸进程被 init 进程接管并回收。
2.4 守护进程
  • 定义: 在后台运行的特殊进程,不受终端控制。
  • 特点:
    • 通常在系统启动时自动启动。
    • 不与用户交互,执行系统级别任务。
    • 生命周期长,直到系统关闭或被显式停止。

3. 协程

3.1 协程简介
  • C++20 新增: 协程是 C++20 引入的一种轻量级并发机制。
  • 特点:
    • 不受操作系统调度,切换开销小。
    • 适合处理大量轻型任务。
    • 依赖运行时环境或库实现调度和切换。
3.2 协程与线程的比较
  • 依赖关系: 线程由操作系统调度,协程由程序员显式管理。
  • 并发性能: 线程可充分利用多核处理器,协程适合单线程内大量任务。
  • 切换机制: 线程切换涉及内核态和用户态切换,协程切换在用户态完成。
  • 同步方式: 线程通过共享内存或消息传递同步,协程通过显式调度和消息传递同步。

4. 总结

  • 线程: 适合需要充分利用多核处理器的场景,但线程数量受限于系统资源。
  • 协程: 适合处理大量轻型任务,切换开销小,但无法直接利用多核处理器。

相关文章:

  • Python基础语法——注释和输入输出
  • Go 语言的 map 在解决哈希冲突时,主要使用了链地址法同时参考了开放地址法的思想即每个桶的 8个 key val对是连续的
  • 如何利用游戏盾提升在线游戏的安全性?
  • 2025 年蓝桥杯 Java B 组真题解析分享
  • 大模型平台Dify工作流高效调用Ragflow知识库,解决其原生知识库解析和检索能力不足的问题
  • 基于ssm的航空售票系统
  • by组态适用领域
  • Shell编程之函数与数组
  • 临床协调简历模板
  • python——学生管理系统
  • 5款电脑健康状况监测软件
  • STL详解 - vector的模拟实现
  • AI核心概念之“RAG” - 来自DeepSeek
  • curl命令
  • AI大模型与行业变革:从传统到智能的跃迁之路
  • [net 5] udp_dict_server 基于udp的简单字典翻译(服务器与业务相分离)
  • leetcode 121. Best Time to Buy and Sell Stock
  • 编译原理(自考13007)
  • OpenAI GPT-4.1系列模型的突破与潜力
  • emotn ui桌面软件tv版下载安装教程-emotn ui桌面好用吗
  • 观察|首个半马落幕:人形机器人场景应用才刚站上起点
  • 人民日报读者点题·共同关注:花粉过敏增多,如何看待城市绿化“成长的烦恼”
  • 北京理工大学解除宫某聘用关系,该教师被指涉嫌骚扰猥亵学生
  • 云南:近两千亩拍得土地因规划变更不得开发,政府要求转型、企业无力为继
  • 凭春晚分会场爆火的无锡,为何请来了上海主流媒体和网络大V
  • 加力扩围支持消费品以旧换新,江苏要送出1800万元彩票