首頁 > 後端開發 > Golang > 為什麼將 `sync.WaitGroup` 與外部函數一起使用會導致死鎖?

為什麼將 `sync.WaitGroup` 與外部函數一起使用會導致死鎖?

Linda Hamilton
發布: 2024-11-06 00:50:02
原創
874 人瀏覽過

Why does using `sync.WaitGroup` with external functions lead to a deadlock?

使用帶有外部函數的sync.WaitGroup的最佳實踐

在提供的程式碼片段中,您在嘗試使用同步時遇到死鎖.WaitGroup 具有外部函數。此錯誤源自於錯誤地將 WaitGroup 的副本傳遞給外部函數,導致未在預期的 WaitGroup 上呼叫 Done() 方法。

要解決此問題,請確保將指標傳遞給而是等待群組。透過這樣做,外部函數可以存取正確的 WaitGroup 並適當地呼叫 Done()。以下是修正後的程式碼:

<code class="go">package main

import (
    "fmt"
    "sync"
)

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

    var wg sync.WaitGroup
    wg.Add(2)

    go Print(ch, &wg) // Pass a pointer to the WaitGroup

    go func() {
        for i := 1; i <= 11; i++ {
            ch <- i
        }
        close(ch)
        defer wg.Done()
    }()

    wg.Wait() // Wait for both goroutines to finish
}

func Print(ch <-chan int, wg *sync.WaitGroup) {
    for n := range ch { // Read from the channel until it's closed
        fmt.Println(n)
    }
    defer wg.Done()
}</code>
登入後複製

或者,您可以修改Print 函數的簽章以刪除WaitGroup 參數,如下所示:

<code class="go">func Print(ch <-chan int) {
    for n := range ch { // Read from the channel until it's closed
        fmt.Println(n)
    }
}</code>
登入後複製

在這種情況下,Print函數負責在完成後關閉WaitGroup。這種方法更適合外部函數不需要直接存取 WaitGroup 的場景。

以上是為什麼將 `sync.WaitGroup` 與外部函數一起使用會導致死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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