C/C++ 干货分享之进程与线程
在操作系统与并发编程中,
进程与
线程是核心概念,C/C++开发者需深入理二者的本质、差异及应用场景。聚焦干货,直击关键要点。
进程:独立的执行单元
进程是操作系统资源分配的基本单位,每个进程拥有独立的地址空间、内存、文件描述符等资源。进程间相互隔离,一个进程崩溃通常不会影响其他进程。
C/C++中创建进程的经典方式是`fork()`系统调用Unix/Linux环境。调用`fork()`后,操作系统会复制当前进程父进程的地址空间,生成新进程子进程,父子进程仅PID不同。例如:
```c
#include
pid_t pid = fork();
if (pid == 0) { /* 子进程逻辑 */ }
else if (pid > 0) { /* 父进程逻辑 */ }
```
子进程对内存的修改不会影响父进程,这得益于写时复制Copy-On-Write 机制——仅当子进程修改数据时才实际复制内存页,减少资源开销。
线程:进程内的轻量级执行流
线程是进程内的执行单元,是操作系统调度的基本单位。同一进程内的线程共享进程的地址空间、文件描述符等资源,但拥有独立的栈空间和寄存器状态。
C/C++中线程管理依赖POSIX线程库`pthread`,通过`pthread_create()`创建线程:
```c
#include
void* thread_func(void* arg) { /* 线程逻辑 */ return NULL; }
pthread_t tid;
pthread_create(&tid, NULL, thread_func, NULL);
```
线程创建开销远小于进程,因需复制地址空间,仅需分配栈和寄存器。但线程共享资源也带来风险:需通过互斥锁`pthread_mutex_t`、条件变量`pthread_cond_t`等同步机制避免竞态条件。
进程与线程的核心差异
1. 地址空间:进程独立,线程共享
- 进程有各自的虚拟地址空间,数据不互通;线程共享进程地址空间,可直接访问全局变量、堆内存。
2. 资源开销:进程重,线程轻
- 进程创建/销毁需分配/释放大量资源内存、文件句柄等,耗时毫秒级;线程创建/销毁仅需栈和寄存器,耗时微秒级。
3. 通信方式:进程需IPC,线程直接共享
- 进程通信依赖管道、消息队列、共享内存等IPC机制;线程可通过全局变量直接通信,但需同步。
4. 健壮性:进程隔离性强,线程易“一损俱损”
- 进程崩溃不影响其他进程;线程崩溃可能导致整个进程终止如栈溢出、除零错误。
应用场景选择
- 用进程:需强隔离如多任务沙箱、独立资源管理如多服务进程。
- 用线程:需轻量级并发如Web服务器处理请求、共享数据如多线程计算。
掌握进程与线程的本质,是C/C++并发编程的基石。理其差异,才能在实际开发中合理选型,平衡性能与稳定性。