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

我是 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("--------------------------------------------------------")

    }

}


ITMISS
浏览 98回答 1
1回答

蝴蝶刀刀

不,这绝对不安全。您应该围绕访问使用同步原语events,或重新设计以使用通道。您的代码今天在特定架构/操作系统上可能运行良好,但它可能会因微小的更改和/或在另一个架构/操作系统上而意外中断。尝试运行您的代码以-race进行验证。你可能会看到WARNING: DATA RACE。另请参阅此答案。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go