首頁 > 後端開發 > Golang > 將sync.WaitGroup與外部函數一起使用時如何避免死鎖?

將sync.WaitGroup與外部函數一起使用時如何避免死鎖?

Mary-Kate Olsen
發布: 2024-11-06 05:06:02
原創
662 人瀏覽過

How to Avoid Deadlock When Using sync.WaitGroup with an External Function?

sync.WaitGroup 與外部函數的最佳使用

問題:

問題:

實現同步。具有外部函數的 WaitGroup 在嘗試列印數字 1 到 11 時導致死鎖。具體來說,錯誤發生在 wg.Wait() 行。

解決方案1(錯誤方法):

設定wg.Add(1) 而不是2 是不正確的解決方案,因為它沒有解決根本問題。

解決方案2(改進的方法):
  • 修改程式碼如下:
在main函數中,使用&wg將sync. WaitGroup的位址傳遞給Print函數。
<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)

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

    wg.Wait() //deadlock here
}                

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

去掉wg Print 函式簽章中的參數。

說明:

將 wg 的位址傳遞給 Print 可確保操作同一個 WaitGroup 實例。從 Print 函數簽章中刪除 wg 消除了函數了解外部 WaitGroup 的需要。

結論:第二種解決方案是一種更穩健的方法,可以避免死鎖並保持 Print 函數與 wg 的獨立性。

以上是將sync.WaitGroup與外部函數一起使用時如何避免死鎖?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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