这是 Go 中的竞争条件吗

2024年 2月 15日 31.9k 0

这是 go 中的竞争条件吗

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 登录后复制

以上就是这是 Go 中的竞争条件吗的详细内容,更多请关注每日运维网(www.mryunwei.com)其它相关文章!

相关文章

JavaScript2024新功能:Object.groupBy、正则表达式v标志
PHP trim 函数对多字节字符的使用和限制
新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
为React 19做准备:WordPress 6.6用户指南
如何删除WordPress中的所有评论

发布评论