Go Race

2024年8月29日 | 1 分钟阅读

当两个或多个 goroutine 试图访问同一个资源时,Go 中就会发生竞态条件。当一个变量试图读取和写入资源而没有考虑到其他例程时,可能会发生这种情况。

Go 竞态条件示例

输出

foo:  0 Count:  1
bar:  0 Count:  1
foo:  1 Count:  2
foo:  2 Count:  3
foo:  3 Count:  4
bar:  1 Count:  2
foo:  4 Count:  5
foo:  5 Count:  6
foo:  6 Count:  7
bar:  2 Count:  3
bar:  3 Count:  4
bar:  4 Count:  5
foo:  7 Count:  8
foo:  8 Count:  9
bar:  5 Count:  6
bar:  6 Count:  7
foo:  9 Count:  10
bar:  7 Count:  8
bar:  8 Count:  9
bar:  9 Count:  10
last count value  10

正如你在上面的例子中看到的,计数资源被 2 个 go 例程访问。 每个例程迭代 10 次。 在这种情况下,计数变量最后应该是 20。 但事实并非如此,因为它正在模拟竞态条件。


下一个主题Go 互斥锁