在Linux中,线程间通信(Inter-Thread Communication, 简称ITC)是指在同一进程内的多个线程之间交换数据和信息。线程间通信是并发编程中的一个重要概念,它允许线程协同工作,共享资源,并同步它们的执行。
Linux中线程间通信的主要方式有以下几种:
基础概念:多个线程共享进程的地址空间中的一块内存区域。 优势:通信速度快,因为数据不需要复制。 应用场景:大数据量的传输,频繁的数据交换。 示例代码:
#include <sys/mman.h>
#include <fcntl.h>
#include <unistd.h>
#include <pthread.h>
// 创建共享内存
int fd = shm_open("/my_shared_mem", O_CREAT | O_RDWR, 0666);
ftruncate(fd, sizeof(int));
int* shared_mem = (int*)mmap(0, sizeof(int), PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
// 线程函数中使用共享内存
void* thread_func(void* arg) {
*shared_mem = 42; // 写入数据
return NULL;
}
基础概念:用于控制多个线程对共享资源的访问。 优势:可以防止竞态条件,实现线程同步。 应用场景:限制对有限资源的访问,如数据库连接池。 示例代码:
#include <semaphore.h>
#include <pthread.h>
sem_t sem;
void* thread_func(void* arg) {
sem_wait(&sem); // 获取信号量
// 访问共享资源
sem_post(&sem); // 释放信号量
return NULL;
}
int main() {
sem_init(&sem, 0, 1); // 初始化信号量为1
// 创建线程...
sem_destroy(&sem); // 销毁信号量
}
基础概念:允许线程等待某个条件成立,或者在特定条件发生时通知其他线程。 优势:可以实现复杂的线程同步模式。 应用场景:生产者-消费者问题,线程池任务调度。 示例代码:
#include <pthread.h>
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
int ready = 0;
void* producer(void* arg) {
pthread_mutex_lock(&mutex);
ready = 1;
pthread_cond_signal(&cond); // 通知消费者
pthread_mutex_unlock(&mutex);
return NULL;
}
void* consumer(void* arg) {
pthread_mutex_lock(&mutex);
while (!ready) {
pthread_cond_wait(&cond, &mutex); // 等待通知
}
// 处理数据
pthread_mutex_unlock(&mutex);
return NULL;
}
基础概念:线程可以发送和接收消息。 优势:解耦发送者和接收者,支持异步通信。 应用场景:任务分发,日志记录。 示例代码:
#include <mqueue.h>
mqd_t mq;
void* sender(void* arg) {
mq_send(mq, "Hello", 5, 0); // 发送消息
return NULL;
}
void* receiver(void* arg) {
char buffer[10];
mq_receive(mq, buffer, sizeof(buffer), NULL); // 接收消息
return NULL;
}
int main() {
mq = mq_open("/my_queue", O_CREAT | O_RDWR, 0666, NULL);
// 创建发送者和接收者线程...
mq_close(mq);
mq_unlink("/my_queue");
}
竞态条件:多个线程同时访问和修改共享数据,可能导致不可预测的结果。使用互斥锁(mutex)或信号量来保护共享资源。 死锁:线程互相等待对方释放资源,导致所有线程都无法继续执行。确保锁的获取顺序一致,使用超时机制,避免嵌套锁。 饥饿:某些线程长时间无法获得执行机会。使用公平锁,合理设计线程调度策略。
通过合理选择和使用上述线程间通信机制,可以有效地解决多线程编程中的同步和通信问题。
领取专属 10元无门槛券
手把手带您无忧上云