为什么这个没有数据竞争(输出一直都是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)导致的,你去掉这句试试

2年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!