douxin8383 2019-02-20 03:51
浏览 123

Golang中的复制并发安全吗?

In some circumstance, i would copy some content to different piece of the slice. Like this

a := make([]int, 10)
for i := 0; i < 10; i++ {
    b := []int{i}
    go func(i int) {
        copy(a[i:i+1], b)
    }(i)
}
time.Sleep(time.Second)
fmt.Println(a)

It leads DATA RACE. But it always behave right in product environment.

So my question is:

  1. Any data race cloud be undefined behavior?
  2. Can i always get right result in such a practice?
  • 写回答

1条回答 默认 最新

  • douxihui8270 2019-02-20 04:10
    关注

    To avoid the data race, which will have undefined results, synchronize. For example,

    package main
    
    import (
        "fmt"
        "sync"
    )
    
    func main() {
        var wg sync.WaitGroup
        a := make([]int, 10)
        for i := 0; i < 10; i++ {
            b := []int{i}
            wg.Add(1)
            go func(i int) {
                defer wg.Done()
                copy(a[i:i+1], b)
            }(i)
        }
        wg.Wait()
        fmt.Println(a)
    }
    

    Playground: https://play.golang.org/p/rYCBMV7wuNn

    Output:

    $ go run -race norace.go
    [0 1 2 3 4 5 6 7 8 9]
    $
    

    Package sync

    import "sync"
    

    type WaitGroup

    A WaitGroup waits for a collection of goroutines to finish. The main goroutine calls Add to set the number of goroutines to wait for. Then each of the goroutines runs and calls Done when finished. At the same time, Wait can be used to block until all goroutines have finished.

    A WaitGroup must not be copied after first use.

    type WaitGroup struct {
            // contains filtered or unexported fields
    }
    
    评论

报告相同问题?

悬赏问题

  • ¥50 potsgresql15备份问题
  • ¥15 Mac系统vs code使用phpstudy如何配置debug来调试php
  • ¥15 目前主流的音乐软件,像网易云音乐,QQ音乐他们的前端和后台部分是用的什么技术实现的?求解!
  • ¥60 pb数据库修改与连接
  • ¥15 spss统计中二分类变量和有序变量的相关性分析可以用kendall相关分析吗?
  • ¥15 拟通过pc下指令到安卓系统,如果追求响应速度,尽可能无延迟,是不是用安卓模拟器会优于实体的安卓手机?如果是,可以快多少毫秒?
  • ¥20 神经网络Sequential name=sequential, built=False
  • ¥16 Qphython 用xlrd读取excel报错
  • ¥15 单片机学习顺序问题!!
  • ¥15 ikuai客户端多拨vpn,重启总是有个别重拨不上