进程和线程

进程:操作系统资源最小单位(独立内存、文件句柄、PID、虚拟地址空间,互相隔离)
线程:进程内执行单元,共享进程全部内存、文件、句柄,仅私有栈 / 寄存器

线程间通信

线程间通信(同进程,共享地址空间)

1. 通信手段(传数据)

共享变量:全局 / 静态 / 类成员,所有线程直接读写
std::promise/future:一次性传递返回值
容器 + 锁:队列配合 mutex 做消息队列
boost asio channel:封装好的线程异步消息通道

2. 同步手段(防竞争、协调执行)

互斥:mutex、atomic(你代码里 locked_)、读写锁
等待通知:condition_variable
同步栅栏:latch/barrier

3. 特点

无需内核拷贝,速度极快
不加同步直接读写 = 数据竞争、未定义行为
一个线程崩溃,整个进程全部挂掉

进程间通信IPC(进程内存完全隔离,必须内核中转)

1. 主流 IPC(Inter-processing communication) 方式

管道(匿名管道:父子进程;FIFO 命名管道:任意本地进程)
共享内存(最快 IPC,需搭配信号量同步)
消息队列(内核存储结构化消息)
Unix 域 Socket(本地双向 IPC,asio 常用)
TCP/UDP Socket(本机 + 跨主机通用)
信号 Signal:仅简单通知,不能传数据
mmap 内存映射文件、Redis / 文件等第三方介质

2. 进程同步工具

POSIX 信号量、进程间 mutex、文件锁,用来保护共享内存 / 公共资源

3. 特点

地址空间隔离,数据要在内核拷贝,开销更大
进程崩溃互不影响,隔离性好
跨程序、跨机器都能通信

同步异步

1. 同步(阻塞调用)

调用发起后,线程卡住等待,直到操作完成才返回。
例子:普通 recv、管道 read、普通 lock ()
优点:逻辑简单直观;缺点:线程卡死,无法干别的事

2. 异步(非阻塞 + 回调 / 协程)

调用立刻返回,不会阻塞线程;完成后通过回调、信号、channel、协程唤醒处理。
例子:boost asio async_receive、channel co_await、epoll
优点:单线程可处理大量连接 / 任务,高并发;缺点:逻辑分层复杂

同步 IO:发请求,原地等结果,线程卡死;
异步 IO:发请求直接走人,有消息了再来通知你处理。

同步 / 异步是 IO 调用的属性,不局限于线程内部,跨进程通信一样适用; 不要把「同步 IO」和「多线程同步锁」两个同名概念弄混。

协程yield

普通同步锁(std::mutex):抢不到锁就休眠操作系统线程,简单但不能用于 asio 高并发 IO 线程;
协程异步锁(async_mutex):抢不到锁只暂停当前协程,释放线程处理其他任务,专为 asio 异步网络设计;
两者核心功能一致:保证资源互斥访问;核心区别:阻塞的是协程还是操作系统线程。
时间片轮转和协程的区别
时间片轮转(操作系统干的)
想象你在食堂排队打饭:
每个人只能打 10秒,时间一到,不管你有没有打完,必须走人,下一个人上来
👉 你不能控制什么时候停,是“被赶走的”
协程(程序自己控制)
还是你一个人做多件事:
你在做作业 ✍️,写一会儿,觉得累了 👉 自己去刷手机 📱,再回来继续写
👉 什么时候停、什么时候继续,完全你自己决定

构造析构

👉 构造函数:对象刚创建时自动调用(负责初始化)
👉 析构函数:对象要销毁时自动调用(负责收尾清理)

更多推荐