具有平等存取權的通道多路復用器
這個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中文網其他相關文章!