首頁 > 後端開發 > Golang > 為什麼按值傳遞 WaitGroup 結構會導致 Go Channel 通訊死鎖?

為什麼按值傳遞 WaitGroup 結構會導致 Go Channel 通訊死鎖?

Patricia Arquette
發布: 2024-10-29 07:47:02
原創
401 人瀏覽過

Why Does Passing a WaitGroup Structure by Value Cause a Deadlock in Go Channel Communication?

由於按值傳遞結構導致Go 通道通訊死鎖

在您的程式碼中,您在goroutine 通道中遇到了死鎖錯誤溝通。此錯誤是因為您將 WaitGroup 結構按值傳遞給 goroutine,這會建立 WaitGroup 的副本,而不是共用原始參考。

為什麼按值傳遞會導致死鎖

Go 中的結構體是按值傳遞的,而不是按引用傳遞的。當您將結構傳遞給函數時,會建立副本並將其傳遞給該函數。這意味著對函數內結構所做的任何更改都不會反映在函數外部的原始結構中。

在您的情況下,goroutine 在完成任務時會嘗試向 WaitGroup 發出信號。但是,由於他們使用 WaitGroup 的副本,因此他們的 Done() 呼叫不會影響原始 WaitGroup。因此,主協程中的 Wait() 呼叫永遠不會完成,從而導致死鎖。

解決方案:透過指標傳遞

要解決此問題,您可以需要透過指標將 WaitGroup 傳遞給您的 goroutine。這確保了 goroutine 和主 goroutine 共享對 WaitGroup 的相同引用。

工作範例:

這是程式碼的正確版本:

<code class="go">package main

import (
    "fmt"
    "sync"
)

func push(c chan int, wg *sync.WaitGroup) {
    for i := 0; i < 5; i++ {
        c <- i
    }
    wg.Done()
}

func pull(c chan int, wg *sync.WaitGroup) {
    for i := 0; i < 5; i++ {
        result, ok := <-c
        fmt.Println(result, ok)
    }
    wg.Done()
}

func main() {
    var wg sync.WaitGroup
    wg.Add(2)
    c := make(chan int)

    go push(c, &wg)
    go pull(c, &wg)

    wg.Wait()
}</code>
登入後複製

現在,當您執行此程式碼時,您應該不再遇到死鎖錯誤。 goroutine 將成功向 WaitGroup 發出訊號,主 goroutine 將能夠完成其執行。

以上是為什麼按值傳遞 WaitGroup 結構會導致 Go Channel 通訊死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板