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

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

Linda Hamilton
Linda Hamilton原創
2024-11-06 00:50:02786瀏覽

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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn