問題:
Go 中如何安全讀取數據來自並行計算中的單獨線程?具體來說,如何在不影響資料完整性的情況下從工作線程收集資料?
場景:
主執行緒建立多個非同步運行的工作實例。每 10 秒,主執行緒需要從工作執行緒收集值(例如迭代計數)並顯示綜合報告。
問題:
安全嗎直接讀取worker的值?此外,是否有其他方法可以有效地實現此要求?
答案:
直接從worker讀取值是不安全的,因為它違反了Go的並發模型。在 Go 中,goroutine 之間共享的資料必須透過同步機制進行保護,以防止同時寫入操作導致資料損壞。
為了解決這個問題,一個方法是使用sync.RWMutex 資料結構:
使用sync.RWMutex的範例實作:
type Worker struct { iterMu sync.RWMutex iter int } func (w *Worker) Iter() int { w.iterMu.RLock() defer w.iterMu.RUnlock() return w.iter } func (w *Worker) setIter(n int) { w.iterMu.Lock() w.iter = n w.iterMu.Unlock() }
或者,sync/atomic 套件提供原子操作,確保執行緒安全存取共享變數。使用sync/atomic的範例實作:
type Worker struct { iter int64 } func (w *Worker) Iter() int64 { return atomic.LoadInt64(&w.iter) } func (w *Worker) setIter(n int64) { atomic.StoreInt64(&w.iter, n) }
透過利用這些方法,這兩種方法都提供了一個強大的解決方案,可以從單獨的執行緒讀取值,同時保持資料完整性。
以上是如何安全地從並行 Go 例程讀取共享資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!