1. 线程与进程通信的核心概念
在Linux系统中,线程和进程是程序执行的基本单位。进程是资源分配的最小单位,而线程是CPU调度的最小单位。一个进程可以包含多个线程,这些线程共享进程的资源(如内存空间、文件描述符等),但每个线程有自己的栈和寄存器状态。
进程间通信(IPC)是指不同进程之间传递数据或信号的机制。由于进程拥有独立的地址空间,操作系统需要提供专门的机制来实现这种通信。而线程间通信则相对简单,因为它们共享相同的地址空间,可以直接通过共享变量进行交互。
注意:虽然线程可以直接访问共享内存,但必须使用同步机制(如互斥锁)来避免竞态条件,否则可能导致数据不一致。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 线程间通信的主要方法
2.1 共享内存
线程间最直接的通信方式就是通过共享变量。由于同一进程的所有线程共享相同的内存空间,一个线程可以直接读写另一个线程可见的全局变量或堆内存。
c复制#include <pthread.h>
#include <stdio.h>
int shared_var = 0;
void* thread_func(void* arg) {
for (int i = 0; i < 100000; i++) {
shared_var++;
}
return NULL;
}
int main() {
pthread_t t1, t2;
pthread_create(&t1, NULL, thread_func, NULL);
pthread_create(&t2, NULL, thread_func, NULL);
pthread_join(t1, NULL);
pthread_join(t2, NULL);
printf("Final value: %d\n", shared_var);
return 0;
}
这个简单的例子展示了两个线程共享一个全局变量。然而,这个实现存在严重问题:对shared_var的递增操作不是原子性的,可能导致竞态条件。
2.2 互斥锁(Mutex)
为了解决共享内存的同步问题,我们需要使用互斥锁:
c复制#include <pthread.h>
#include <stdio.h>
int shared_var = 0;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
void* thread_func(void* arg) {
for (int i = 0; i < 100000; i++) {
pthread_mutex_lock(&mutex);
shared_var++;
pthread_mutex_unlock(&mutex);
}
return NULL;
}
// main函数同上
现在,每次对shared_var的修改都被互斥锁保护,确保了操作的原子性。
2.3 条件变量(Condition Variables)
条件变量用于线程间的通知机制,允许线程等待某个条件成立:
c复制#i
