Go-Flavored Concurrency in C
2 days ago
- #concurrency
- #Go
- #pthreads
- Go 的并发模型因其轻量级的 goroutine、通道以及高效的运行时调度器而广受欢迎,但在 C 语言中仅使用 POSIX 线程来复现该模型时,需要做出一些权衡。
- Solod(So)基于 pthread 原语实现了一个并发栈:sync.Mutex 和 sync.Cond 包装了 pthread_mutex_t 和 pthread_cond_t,提供了基本的同步机制。
- So 中的原子操作直接映射到 C 的 __atomic 内置函数,在加载、存储和比较交换操作上与 Go 的性能相当,且无需 pthread 的开销。
- So 的 conc.Pool 使用固定数量的工作线程和一个共享任务队列,通过互斥锁和条件变量构建,适用于粗粒度工作负载,但不适用于像 goroutine 那样数千个阻塞任务的情况。
- So 中的通道(conc.Chan[T])支持缓冲和无缓冲模式,使用互斥锁和条件变量进行同步,在池化任务方面性能接近 Go,但在细粒度任务传递方面由于内核唤醒开销而较慢。
- 基准测试显示,So 基于 pthread 的并发实现在无竞争锁和原子操作方面具有竞争力,但当线程阻塞时,条件变量和通道的性能显著下降,无缓冲通道传输可能慢达 23 倍。
- 设计决策包括使用 pthread 而非纤程以简化实现,将并发功能保留在标准库中以支持显式分配和灵活性,并为通道操作提供超时机制而非 select 语句。
- 该方法在粗粒度工作负载下提供了简单性且性能接近 Go,但由于内核线程管理开销,无法在细粒度并发方面匹配 Go 的效率。