【嵌入式八股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. 总结

  • 线程: 适合需要充分利用多核处理器的场景,但线程数量受限于系统资源。
  • 协程: 适合处理大量轻型任务,切换开销小,但无法直接利用多核处理器。
#牛客激励计划#
嵌入式八股/模拟面试拷打 文章被收录于专栏

一些八股模拟拷打Point,万一有点用呢

全部评论
fork示例很清晰
点赞 回复 分享
发布于 2025-03-06 20:01 山东
fork示例很清晰
点赞 回复 分享
发布于 2025-03-03 11:24 陕西
接好运
点赞 回复 分享
发布于 2025-03-03 11:24 陕西

相关推荐

小浪_Coding:1. 个人技能排版太乱, 写的技术栈太浅了, 跟测试,自动化相关的太少; 2. 项目开发类的太简单没有亮点, 算法类的项目建议只放一个,最好有自动化,CI/CD, pipline的项目, 需要更换; 3.整体排版需要优化, SOOB打招呼都需要注意等.
我的简历长这样
点赞 评论 收藏
分享
评论
2
8
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务