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

Go lang中的线程同步

Go lang中的线程同步

Go
湖上湖 2021-09-13 10:26:10
我想更多地了解线程同步在 go 中是如何工作的。下面是我的程序的运行版本,它使用完成的通道进行同步。package mainimport (    . "fmt"    "runtime")func Goroutine1(i_chan chan int, done chan bool) {    for x := 0; x < 1000000; x++ {        i := <-i_chan        i++        i_chan <- i    }    done <- true}func Goroutine2(i_chan chan int, done chan bool) {    for x := 0; x < 1000000; x++ {        i := <-i_chan        i--        i_chan <- i    }    done <- true}func main() {    i_chan := make(chan int, 1)    done := make(chan bool, 2)    i_chan <- 0    runtime.GOMAXPROCS(runtime.NumCPU())    go Goroutine1(i_chan, done)    go Goroutine2(i_chan)    <-done    <-done    Printf("This is the value of i:%d\n", <-i_chan)}但是,当我尝试在没有任何同步的情况下运行它时。使用等待语句且没有通道来指定何时完成,因此没有同步。const MAX = 1000000func Goroutine1(i_chan chan int) {    for x := 0; x < MAX-23; x++ {        i := <-i_chan        i++        i_chan <- i    }}func main() {    i_chan := make(chan int, 1)    i_chan <- 0    runtime.GOMAXPROCS(runtime.NumCPU())    go Goroutine1(i_chan)    go Goroutine2(i_chan)    time.Sleep(100 * time.Millisecond)    Printf("This is the value of i:%d\n", <-i_chan)}它会打印出错误的 i 值。如果您延长等待时间,例如 1 秒,它将完成并打印出正确的语句。我有点理解它有一些东西在你打印之前没有完成两个线程i_chan我只是对它的工作原理有点好奇。
查看完整描述

1 回答

  • 1 回答
  • 0 关注
  • 187 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信