Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

同步原语

本章介绍 ASCO 提供的同步原语。它们用于在多个并发执行流之间建立互斥与协调关系。

本章只描述行为与语义:你能做什么、它会怎样表现、以及常见用法。


目录


选型建议

何时使用 channel

channel 适合在并发执行流之间传递值,并通过等待来表达背压(缓冲满时发送等待,缓冲空时接收等待)。

何时使用 spinlock

spinlock 适合保护非常短的临界区:

  • 修改一个小的共享状态(例如计数器、指针、短容器操作);
  • 临界区内不进行可能长时间运行的操作。

注意:

  • 不要在持有锁期间跨越 co_await

何时使用 semaphore

semaphore 适合表达“许可”的语义:

  • 并发限流(最多允许同时进行 N 个工作);
  • 生产者/消费者式的资源计数(有资源才能继续)。

acquire() 是可等待操作:当许可不足时会等待直到有许可被释放。


常见约定

  • try_* 系列 API 表达“不等待的快速路径”;失败时走其它分支。
  • 需要等待时,优先用明确的同步原语(例如 semaphore::acquire()),避免忙等。