Go 中多執行緒並發操作的場景下,保證資料存取的安全性至關重要。本文探討了主執行緒需要從工作執行緒收集資料而不影響執行緒安全性的場景。
場景
主線程創建多個工作線程,每個工作線程運行在它自己的 goroutine 並定期增加迭代計數。每 10 秒,主執行緒的目標是從工作執行緒收集迭代計數並顯示綜合統計資料。
問題
鑑於主執行緒僅讀取而各個執行緒寫入,直接存取值安全嗎?如何有效地實現這一點?
答案
在Go 中,直接從不同執行緒讀取值而不進行同步本質上是不安全的,因為它可能會表現出未定義的行為。為了確保資料完整性,某種形式的同步是必要的。
實作注意事項
建議的解決方案利用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) incIter() { w.iterMu.Lock() w.iter++ 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) incIter() { atomic.AddInt64(&w.iter, 1) }
以上是如何安全地從 Go 中的多個 Goroutine 讀取值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!