首頁 > 後端開發 > Golang > Go 多工器如何確保多個輸入通道的公平和安全存取?

Go 多工器如何確保多個輸入通道的公平和安全存取?

Patricia Arquette
發布: 2024-11-23 09:12:23
原創
623 人瀏覽過

How Can a Go Multiplexer Ensure Fair and Safe Access Across Multiple Input Channels?

具有平等存取權的通道多路復用器

這個Go 多路復用器旨在將多個通道的輸出合併為一個,確保每個輸入通道都有輸出通道的平等權利。然而,提供的測試給出了意想不到的結果。

問題分析

關鍵問題在於 Mux 函數產生的 goroutine。通道參數 c 旨在表示每個輸入通道,在循環的每次迭代中都會更新。這意味著所有 goroutine 最終都會從同一個通道拉取,而不是它們預期的各個通道。

解決方案

要解決此問題,請將goroutine 建立循環修改為通過每個goroutine 的正確通道:

for _, c := range channels {
    go func(c <-chan big.Int) {
        ...
    }(c)
}
登入後複製

透過每個goroutine 的正確通道:

透過每個goroutine 的正確通道:

透過每個goroutine 的正確通道:

通過這樣做,每個goroutine 在以下情況下捕獲通道的值:它被創建,消除了問題並產生了期望的結果。
import (
    "math/big"
    "sync"
)

// ... other code ...

// The channel to output to.
ch := make(chan big.Int, len(channels))

var wg sync.WaitGroup
wg.Add(len(channels))

// ... other code ...

// Close the channel when the pumping is finished.
go func() {
    // Wait for everyone to be done.
    wg.Wait()
    // Close.
    close(ch)
}()
登入後複製

提高並發安全除了確保對輸出通道的平等存取之外,確保對輸出通道的平等存取也至關重要並發安全。初始程式碼使用 int 變數 n 來追蹤輸入通道的關閉。然而,當 GOMAXPROCS 大於 1 時,多個 goroutine 有可能同時存取 n,從而可能導致競爭條件。 更安全的方法是使用sync.WaitGroup 對象,它允許 goroutine 相互等待並確保 n 被安全更新。使用sync.WaitGroup的修訂後的代碼:透過這些修改,多路復用器現在可以正確且安全地運行,確保所有輸入通道都可以平等地訪問輸出通道並避免競爭條件。

以上是Go 多工器如何確保多個輸入通道的公平和安全存取?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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