Golang 中的信号量和 GNU make - Tony Finch

主要观点:信号量是古老的并发原语,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循环来获取和释放所有槽。
阅读 10
0 条评论