php小编苹果在这篇文章中将为您解答一个常见的问题:“这是Go中的竞争条件吗?”在编写并发程序时,竞争条件是一个常见的问题,它可能导致数据不一致以及其他意想不到的结果。在Go语言中,我们可以使用互斥锁、通道等机制来避免竞争条件的发生。让我们一起来探讨一下吧!
func main() { m := map[string]int{ "foo": 42, "bar": 1337, } go func() { time.Sleep(1 * time.Second) tmp := map[string]int{ "foo": 44, "bar": 1339, } m = tmp }() for { val := m["foo"] fmt.Println(val) } }
我在很多包中都看到了这个。
为什么这不被视为竞争条件?
go run -race .
没有错误。
正如@volker 所指出的,这是一场数据竞赛。而且由于只有一次写入,因此很难被检测到。这是一个修改后的演示,可以轻松触发数据争用错误:
package main import ( "fmt" "time" ) func main() { m := map[string]int{ "foo": 42, "bar": 1337, } done := make(chan any) go func() { for i := 0; i < 100; i++ { time.Sleep(time.Microsecond) tmp := map[string]int{ "foo": 44, "bar": 1339, } m = tmp } close(done) }() for { select { case <-done: return default: val := m["foo"] fmt.Println(val) } } }
以上是这是 Go 中的竞争条件吗的详细内容。更多信息请关注PHP中文网其他相关文章!