同步原语
本章介绍 ASCO 提供的同步原语。它们用于在多个并发执行流之间建立互斥与协调关系。
本章只描述行为与语义:你能做什么、它会怎样表现、以及常见用法。
目录
选型建议
何时使用 channel
channel 适合在并发执行流之间传递值,并通过等待来表达背压(缓冲满时发送等待,缓冲空时接收等待)。
何时使用 spinlock
spinlock 适合保护非常短的临界区:
- 修改一个小的共享状态(例如计数器、指针、短容器操作);
- 临界区内不进行可能长时间运行的操作。
注意:
- 不要在持有锁期间跨越
co_await。
何时使用 semaphore
semaphore 适合表达“许可”的语义:
- 并发限流(最多允许同时进行
N个工作); - 生产者/消费者式的资源计数(有资源才能继续)。
acquire() 是可等待操作:当许可不足时会等待直到有许可被释放。
常见约定
- 用
try_*系列 API 表达“不等待的快速路径”;失败时走其它分支。 - 需要等待时,优先用明确的同步原语(例如
semaphore::acquire()),避免忙等。