为什么这个没有数据竞争(输出一直都是200)

下面代码,理论上 val 的最终结果应该是 100~200 之间的某个值,在笔记本电脑上运行确实如此,val 最终 118。但是,当我在台式机上运行时,结果却一直都是 200,谁能帮我解答一下吗?

var val = 0

func main() {
   num := runtime.NumCPU()
   fmt.Println("使用cpu数量", num)
   go add("A")
   go add("B")
   time.Sleep(1 * time.Second)
   fmt.Println("val的最终结果", val)
}

func add(proc string) {
   for i := 0; i < 100; i++ {
      val++
      fmt.Printf("execute process[%s] and val is %d\n", proc, val)
      time.Sleep(5 * time.Millisecond)
   }
}
讨论数量: 1

因为 time.Second==1000*time.Millisecond

你的 add () 里只循环了 1005*time.Millisecond 也就是 500*time.Millisecond

所以 time.Sleep(1 * time.Second) 执行完的时候 add () 早就执行完了

笔记本是因为 fmt.Printf("execute process[%s] and val is %d\n", proc, val) 导致的,你去掉这句试试

3年前 评论