有各种各样的任务执行器,具有不同的属性,其中一些仅支持非阻塞调用。因此,我在想,是否需要使用互斥锁/通道来安全地将任务结果传递给调用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
为非阻塞执行程序提供同步(阻塞和返回值吗?)>
有各种各样的任务执行器,具有不同的属性,其中一些仅支持非阻塞调用。所以,我在想,是否需要使用互斥锁/通道来安全地交付任务...