能否将sync.WaitGroup用于普通函数而非仅配合goroutine使用?
关于sync.WaitGroup在普通函数中使用的合法性说明
这种用法完全符合Go标准库sync包的设计规范,不存在违规问题。
核心逻辑说明
sync.WaitGroup的本质是一个计数器,设计目标是等待一组任意操作执行完成,官方从来没有限制这组操作必须由goroutine执行,只是绝大多数使用场景下,大家会用它来等待多个goroutine的执行结束,才会给人留下「只能配合goroutine使用」的误解。
你的代码逻辑验证
你给出的示例代码逻辑完全自洽,只要满足两个前提就永远不会出问题:
- 所有
m.create()的调用,都发生在m.close()调用之前,不会出现已经调用Wait之后才执行Add的情况 - 你用了
defer m.wg.Done()的写法,已经完美规避了函数异常中断导致Done未调用的问题
额外注意点
- 后续如果需要把
create()内的逻辑改成异步goroutine执行,现有WaitGroup的调用逻辑不需要做任何调整,扩展性很强 - 唯一要避开的坑是:如果后续
create()内部启动了goroutine,千万不要把wg.Add(1)写到goroutine内部,否则会有概率出现Wait已经开始执行、Add还没调用的问题,导致等待提前结束。你现在把Add写在create()入口的写法,完全不会触发这个问题。
内容的提问来源于stack exchange,提问作者Avinash
相关产品推荐
相关产品推荐

