有各种各样的任务执行器,它们具有不同的属性,其中一些仅支持非阻塞调用。因此,我在想,是否需要使用互斥锁/通道来安全地将任务结果传递给调用go-routine,还是WaitGroup
是否足够简单?
为简单起见,以及问题的特殊性,举一个非常幼稚的任务执行器启动函数直接作为go例程的示例:
func TestRace(t *testing.T) {
var wg sync.WaitGroup
a,b := 1,2
wg.Add(1)
// this func would be passed to real executor
go func() {
a,b = a+1,b+1
wg.Done()
}()
wg.Wait()
assert.Equal(t,a,2)
assert.Equal(t,b,3)
}
在我的计算机上,使用-race
选项执行上述测试没有失败。但是,这足够保证吗?如果在不同的CPU内核,CPU内核块(AMD CCX)或多插槽设置的不同CPU上执行例程,该怎么办?
因此,问题是,我可以使用WaitGroup
为非阻塞执行程序提供同步(阻塞和返回值)吗?