为了账号安全,请及时绑定邮箱和手机立即绑定

在没有通道的 goroutine 中安全地从共享数据结构中读取

在没有通道的 goroutine 中安全地从共享数据结构中读取

Go
ITMISS 2022-07-11 14:41:50
我是 Golang 的新手,开始使用 goroutines。我很好奇在不使用通道或互斥锁的情况下从另一个 goroutine 写入的数据结构中读取是否安全。在下面的示例中,events数组对 main 和 goroutine 可见,但 main 只读取它,而 goroutine 正在修改它。这被认为是安全的吗?var events = []string{}func main() {    go func() {        for {            if len(events) > 30 {                events = nil            }            event := "The time is now " + time.Now().String()            events = append(events, event)            time.Sleep(time.Millisecond * 200)        }    }()    for {        for i:=0; i < len(events); i++ {            fmt.Println(events[i])        }        time.Sleep(time.Millisecond * 100)        fmt.Println("--------------------------------------------------------")    }}
查看完整描述

1 回答

?
蝴蝶刀刀

TA贡献1801条经验 获得超8个赞

不,这绝对不安全。您应该围绕访问使用同步原语events,或重新设计以使用通道。

您的代码今天在特定架构/操作系统上可能运行良好,但它可能会因微小的更改和/或在另一个架构/操作系统上而意外中断。

尝试运行您的代码以-race进行验证。你可能会看到WARNING: DATA RACE

另请参阅此答案


查看完整回答
反对 回复 2022-07-11
  • 1 回答
  • 0 关注
  • 97 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号