gpt4 book ai didi

go - 使用 -race 标志时 GO 中的竞争条件是什么意思

转载 作者:IT王子 更新时间:2023-10-29 02:01:19 26 4
gpt4 key购买 nike

考虑以下代码:

package main

import (
"fmt"
"sync"
)

func main() {
var a int
m := new(sync.Mutex)

wg := sync.WaitGroup{}
wg.Add(2)

go func(){
m.Lock()
a = 2
m.Unlock()
wg.Done()
}()

go func(){
//m.Lock()
a = 9
//m.Unlock()
wg.Done()
}()

wg.Wait()

fmt.Println(a)
}

如果我们使用 -race 标志运行此代码,我们会收到存在竞争条件的警告。

1) 这种竞争条件可能会出什么问题?

如果我们取消注释第二个例程中的锁,我们不会收到竞争条件警告。但是我们可以有不同的输出,所以存在竞争条件。

2) 为什么现在我们没有竞争条件警告?

最佳答案

1) 这种竞争条件可能会出什么问题?

  • Undefined behavior
  • 内存损坏
  • 崩溃从字面上看,最糟糕的结果可能是不知道并且可能在您的变量中具有完全无效的值:p

2) 为什么现在我们没有竞争条件警告?

Mutex 是一种可以保证原子性的原语。当锁被取消注释时,运行时/操作系统完全同步对锁保护的语句的访问。即 a 永远不会同时设置为 2 和 9。

这里可能会对性能产生影响(您的应用可能永远不会遇到它们),因为这些是序列化操作。这通常是一个很好的权衡,因为它以潜在的性能影响为代价来确保正确性。


go 文档有关于这个问题的细节的惊人资源:

关于go - 使用 -race 标志时 GO 中的竞争条件是什么意思,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52893411/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com