猿问

Go lang中的线程同步

我想更多地了解线程同步在 go 中是如何工作的。下面是我的程序的运行版本,它使用完成的通道进行同步。


package main


import (

    . "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 = 1000000


func 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我只是对它的工作原理有点好奇。


湖上湖
浏览 185回答 1
1回答
随时随地看视频慕课网APP

相关分类

Go
我要回答