Linux线程间通信与同步:原理、方法与实战
文章目录
Linux多线程编程的核心在于资源共享与协作。线程间通信(IPC)和同步(Synchronization)是解决并发问题的关键。本文从原理出发,结合思维导图和代码示例,系统解析Linux线程间通信与同步的常用方法。
一、原理:共享资源与协作
线程是进程内的执行单元,共享进程的地址空间和资源(如文件描述符、全局变量等)。因此,线程间通信的本质是共享内存访问,但需要解决以下问题:
- 数据竞争:多个线程同时修改共享资源可能导致数据不一致。
- 死锁:线程间因资源互斥请求而陷入循环等待。
- 资源饥饿:某些线程因优先级低或资源被长期占用而无法执行。
同步目标:
- 互斥(Mutual Exclusion):确保同一时刻只有一个线程访问共享资源。
- 同步(Synchronization):协调线程的执行顺序,确保条件满足后再执行。
二、线程间通信与同步的手段
思维导图
线程间通信与同步
├── 同步机制
│ ├── 互斥锁(Mutex)
│ ├── 条件变量(Condition Variable)
│ ├── 读写锁(Read-Write Lock)
│ ├── 信号量(Semaphore)
│ └── 自旋锁(Spinlock)
├── 通信机制
│ ├── 共享内存(Shared Memory)
│ ├── 管道(Pipe/FIFO)
│ ├── 消息队列(Message Queue)
│ ├── 套接字(Socket)
│ └── 信号(Signal)
└── 辅助工具
└── 线程屏障(Thread Barrier)
三、方法详解
1. 同步机制
1.1 互斥锁(Mutex)
- 原理:通过加锁/解锁操作保护临界区,确保同一时刻只有一个线程访问共享资源。
- 接口:
pthread_mutex_init(&mutex, NULL); // 初始化 pthread_mutex_lock(&mutex); // 加锁 pthread_mutex_unlock(&mutex); // 解锁 pthread_mutex_destroy(&mutex); // 销毁
1.2 条件变量(Condition Variable)
- 原理:与互斥锁配合,线程在条件未满足时等待,其他线程通知后唤醒。
- 接口:
pthread_cond_init(&cond, NULL); // 初始化 pthread_cond_wait(&cond, &mutex); // 等待条件 pthread_cond_signal(&cond); // 唤醒一个线程 pthread_cond_broadcast(&cond); // 唤醒所有线程
1.3 信号量(Semaphore)
- 原理:基于计数器的同步机制,支持多线程并发访问(如资源池)。
- 接口:
sem_init(&sem, 0, 1); // 初始化(初始值为1) sem_wait(&sem); // P操作(减1,若为0则阻塞) sem_post(&sem); // V操作(加1) sem_destroy(&sem); // 销毁
1.4 读写锁(Read-Write Lock)
- 原理:允许多个读线程同时访问,但写线程独占资源。
- 接口:
pthread_rwlock_init(&rwlock, NULL); pthread_rwlock_rdlock(&rwlock); // 读锁 pthread_rwlock_wrlock(&rwlock); // 写锁 pthread_rwlock_unlock(&rwlock);
2. 通信机制
2.1 共享内存(Shared Memory)
- 原理:线程直接访问共享变量,无需拷贝数据。
- 实现:直接定义全局变量即可,需配合互斥锁保护。
2.2 管道(Pipe/FIFO)
- 原理:通过内核缓冲区传递数据,适合父子线程通信。
- 接口:
int pipe(int pipefd[2]); // pipefd[0]读,pipefd[1]写 read(pipefd[0], buffer, size); write(pipefd[1], buffer, size);
2.3 消息队列(Message Queue)
- 原理:通过消息队列传递结构化数据(如POSIX消息队列)。
- 接口:
mqd_t mq = mq_open(...); mq_send(mq, buffer, size, priority); mq_receive(mq, buffer, size, NULL);
2.4 套接字(Socket)
- 原理:基于网络协议(如TCP/UDP)实现跨进程/线程通信。
- 实现:需绑定、监听、连接等步骤,适合分布式场景。
2.5 信号(Signal)
- 原理:通过异步通知机制触发线程行为(如SIGUSR1/SIGUSR2)。
- 接口:
signal(SIGUSR1, handler); // 注册信号处理函数 kill(getpid(), SIGUSR1); // 发送信号
四、完整C语言Demo(整合所有方法)
以下代码演示互斥锁、条件变量、信号量、管道、消息队列的联合使用:
#include <pthread.h>
#include <semaphore.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <mqueue.h>


最低0.47元/天 解锁文章
5万+

被折叠的 条评论
为什么被折叠?



