我想更多地了解線程同步在 go 中是如何工作的。下面是我的程序的運(yùn)行版本,它使用完成的通道進(jìn)行同步。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)}但是,當(dāng)我嘗試在沒有任何同步的情況下運(yùn)行它時(shí)。使用等待語句且沒有通道來指定何時(shí)完成,因此沒有同步。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)}它會(huì)打印出錯(cuò)誤的 i 值。如果您延長等待時(shí)間,例如 1 秒,它將完成并打印出正確的語句。我有點(diǎn)理解它有一些東西在你打印之前沒有完成兩個(gè)線程i_chan我只是對(duì)它的工作原理有點(diǎn)好奇。
- 1 回答
- 0 關(guān)注
- 203 瀏覽
添加回答
舉報(bào)
0/150
提交
取消