我想更多地了解线程同步在 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
提交
取消