一、线程间通信方式(同一进程内,地址空间共享)
线程天然共享进程虚拟地址空间,通信核心是共享内存 + 同步机制。
1. 共享全局变量 / 堆内存
所有线程可直接读写全局变量、malloc堆内存。是最基础的线程通信方式,需配合锁保证线程安全。
2. 互斥锁 pthread_mutex_t
用于保护共享资源,保证同一时刻只有一个线程访问临界区,解决数据竞争,实现线程同步通信。
3. 条件变量 pthread_cond_t
配合互斥锁使用,实现线程等待-唤醒通信;用于生产者消费者模型、线程池任务通知。
4. 信号量 sem_t(POSIX)
自带计数缓冲区,可实现线程互斥、同步、生产者消费者通信;通知不会丢失。
5. 原子变量
无锁通信,依托CPU硬件指令,安全读写计数器、状态标记,适合简单数值同步。
6. eventfd(Linux)
IO事件式线程通信,一个线程写、一个线程阻塞等待可读,无需锁,可融入epoll多路复用。
7. 信号 Signal
异步线程通知,仅传递信号编号,不适合业务数据通信,多用于异常终止、事件通知。
二、进程间通信方式 IPC(多进程,地址空间隔离)
进程地址空间完全隔离,无法直接读写内存,必须通过操作系统IPC机制通信。
1. 匿名管道 pipe
仅支持亲缘父子进程、单向字节流通信,数据读完即消失。
2. 命名管道 FIFO
支持无亲缘任意进程通信,基于文件路径,单向字节流传输。
3. 信号 Signal
进程间异步通知,仅传信号编号,无法传输大量数据,用于事件提醒、进程终止。
4. 共享内存(shmget / mmap)
速度最快的IPC,多进程挂载同一块内核内存;自带数据共享、无同步机制,需配合信号量/管道通知。
5. System V 消息队列
内核维护消息队列,支持带类型的消息收发,可按类型读取消息。
6. System V 信号量
用于多进程之间互斥、同步,不负责传输业务数据。
7. POSIX 消息队列 / 信号量
新版进程同步通信机制,功能优于System V,支持消息优先级、阻塞/非阻塞配置。
8. Unix Domain Socket(AF_UNIX)
本机进程双向通信,不走网络协议栈、性能高;支持传递文件描述符,工程最常用本机IPC。
9. 网络 Socket(TCP/UDP 127.0.0.1)
可本机、可跨机器通信,通用性最强,走完整网络协议栈,开销高于UNIX域套接字。
10. eventfd
可用于进程间简单事件通知,仅传递计数信号,不适合业务数据传输。
三、核心区别
线程间通信:依托共享内存 + 同步工具(锁、条件变量、信号量、原子变量)
进程间通信:依托操作系统IPC机制(管道、共享内存、消息队列、Socket、信号)