Multithreading Go-lang中线程的同步

Multithreading Go-lang中线程的同步,multithreading,go,Multithreading,Go,我想了解更多关于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 <-

我想了解更多关于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)
}
但是,当我尝试运行它时,没有任何同步。使用wait语句和no channel来指定何时完成,因此没有同步

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上的内容之前,它的两个线程都没有完成。我只是有点好奇这是如何工作的。

注意,你的OP编辑了这个问题。 如果

没有同步,例如,无法保证在Goroutine1和Goroutine2完成之前不会退出main。 对于1000000循环,1毫秒的等待似乎足够了,但同样不能保证

func main() {
    i_chan := make(chan int, 1)
    i_chan <- 0
    runtime.GOMAXPROCS(runtime.NumCPU())
    go Goroutine2(i_chan)
    go Goroutine1(i_chan)
    time.Sleep(1 * time.Millisecond)
    Printf("This is the value of i:%d\n", <-i_chan)
}

更多信息请参见,其中规范的方法是使用,如。

在第一个示例中,您是否错过了对Goroutine2的调用?第二个例子中Goroutine2的定义在哪里?您在第二个示例中提到了wait语句—什么是wait语句,它在哪里?注意:Go没有作为语言构造的线程。你是说goroutines吗?@BraveNewCurrency goroutines的可能重复是我对绿色线程的理解,因此你可以编写关键字go,然后启动一个新的绿色线程。对吗?@Amit Kumar Gupta。是的,这里有一些复制错误。我现在确实修好了。通过wait语句,最后是sleep语句。因此,基本上,它并不真正等待任何事情完成它,只是将主线程置于睡眠状态。