【嵌入式八股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. 总结
- 线程: 适合需要充分利用多核处理器的场景,但线程数量受限于系统资源。
- 协程: 适合处理大量轻型任务,切换开销小,但无法直接利用多核处理器。