主要观点:信号量是古老的并发原语,60 多年前发明,能处理介于零、一和多之间的有限数字。文中介绍了三种与信号量相关的内容,包括 Go 语言中的通道是信号量、GNU make 的 jobserver 协议是信号量以及等待并发任务完成的方法。
关键信息:
- Go 语言中通过
make(chan any, MAXPROCS)
创建带缓冲区大小(即信号量初始值)的通道来实现信号量,acquire
操作消耗一个通道槽(传统上叫P()
),release
操作释放一个通道槽(传统上叫V()
)。 - GNU make 的 jobserver 协议以管道形式实现信号量,用管道的已用空间表示信号量值,不能超过
PIPE_BUF
,创建和操作信号量的方式与 Go 通道类似。 - 等待所有并发任务完成时,获取所有可能的槽(会阻塞直到任务完成),然后再释放所有槽。
重要细节: - Go 语言通道中任意类型都可用于信号量,
acquire
操作通过向通道发送nil
消耗槽,release
操作通过从通道接收值释放槽。 - GNU make 的 jobserver 协议中通过创建管道并写入字符来初始化信号量值,获取槽时从管道读取字符,释放槽时将相同字符写回管道。
- 在等待并发任务完成的代码中,通过
for range MAXPROCS
循环来获取和释放所有槽。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。