使用WaitGroup从不同的go例程写入当前堆栈中的堆栈变量是否安全?

问题描述 投票:-2回答:1

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

有各种各样的任务执行器,具有不同的属性,其中一些仅支持非阻塞调用。所以,我在想,是否需要使用互斥锁/通道来安全地交付任务...

go synchronization race-condition goroutine
1个回答
0
投票

JimB也许应该提供答案,但是我将从his comments复制它,从this one开始:

© www.soinside.com 2019 - 2024. All rights reserved.