Go 所有的戈鲁廷人都睡着了

Go 所有的戈鲁廷人都睡着了,go,Go,我编写了一些代码,旨在使用通道进行同步 var counter int64 // shared resource var wg sync.WaitGroup func main() { ch := make(chan int64) wg.Add(2) go incCounter(ch) go incCounter(ch) ch <- counter wg.W

我编写了一些代码,旨在使用通道进行同步

    var counter int64  // shared resource

    var wg sync.WaitGroup

    func main() {
        ch := make(chan int64)

        wg.Add(2)

        go incCounter(ch)
        go incCounter(ch)

        ch <- counter

        wg.Wait()
        fmt.Println("Final Counter:", counter) // expected value is 4
    }

    func incCounter(ch chan int64) {
        defer wg.Done()

        for count := 0; count < 2; count++ {
            value := <-ch
            value++
            counter = value
            ch <- counter
        }
    }
var计数器int64//共享资源
var wg sync.WaitGroup
func main(){
ch:=制造(chan int64)
工作组.添加(2)
进入柜台(ch)
进入柜台(ch)
通道通道
make(chan int)
的隐式大小为零(参考:)

大小为零的通道是无缓冲的。具有指定大小make(chan int,n)的通道是缓冲的。有关缓冲通道与无缓冲通道的讨论,请参阅。处的示例说明了差异

这里,通道
通道
make(chan int)
的隐式大小为零(参考:)

大小为零的通道是无缓冲的。具有指定大小make(chan int,n)的通道是缓冲的。有关缓冲通道与无缓冲通道的讨论,请参阅。处的示例说明了差异


这里,频道<代码>哪里是<代码> WG>代码>?哦,对不起,我忘记了.<代码> WG >代码>同步.WaistGue。@ AkhilThayyilIf,你这样做是为了学习,但这很好,但作为替代,你可能想考虑一个原子计数器来达到这个目的,例子可以在这里找到,谢谢。我会试试看。@McNigoLoad是<代码> WG声明?哦,对不起,我忘记了。<代码> WG的类型是“代码> Sun.WaTyGue。@ AkhilThayyilIf,您这样做是为了学习,但这很好,但作为替代方案,您可能想考虑一个原子计数器用于此目的,示例可以在这里找到,谢谢。我会试试看。”

var counter int64 // shared resource
var wg sync.WaitGroup

func main() {
    ch := make(chan int64, 1)

    wg.Add(2)

    go incCounter(ch)
    go incCounter(ch)

    ch <- counter

    wg.Wait()
    fmt.Println("Final Counter:", counter) // expected value is 4
}

func incCounter(ch chan int64) {
    defer wg.Done()

    for count := 0; count < 2; count++ {
        value := <-ch
        value++
        counter = value
        ch <- counter
    }
}
var counter int64 // shared resource
var wg sync.WaitGroup

func main() {
    ch := make(chan int64)

    wg.Add(2)

    go incCounter(ch)
    go incCounter(ch)

    ch <- counter

    // to ensure one go routine 'incCounter' is completed and one go routine is blocked for unbuffered channel
    time.Sleep(3*time.Second)

    <-ch // to unblock the last go routine

    wg.Wait()
    fmt.Println("Final Counter:", counter) // expected value is 4
}

func incCounter(ch chan int64) {
    defer wg.Done()

    for count := 0; count < 2; count++ {
        value := <-ch
        value++
        counter = value
        ch <- counter
    }
}