首頁 >後端開發 >Golang >如何安全地從並行 Go 例程讀取共享資料?

如何安全地從並行 Go 例程讀取共享資料?

Barbara Streisand
Barbara Streisand原創
2025-01-02 14:31:39389瀏覽

How to Safely Read Shared Data from Parallel Go Routines?

並行Go 例程中從共享資料讀取值

問題:

Go 中如何安全讀取數據來自並行計算中的單獨線程?具體來說,如何在不影響資料完整性的情況下從工作線程收集資料?

場景:

主執行緒建立多個非同步運行的工作實例。每 10 秒,主執行緒需要從工作執行緒收集值(例如迭代計數)並顯示綜合報告。

問題:

安全嗎直接讀取worker的值?此外,是否有其他方法可以有效地實現此要求?

答案:

直接從worker讀取值是不安全的,因為它違反了Go的並發模型。在 Go 中,goroutine 之間共享的資料必須透過同步機制進行保護,以防止同時寫入操作導致資料損壞。

為了解決這個問題,一個方法是使用sync.RWMutex 資料結構:

  • 寫鎖:worker修改共享資料時獲得,保證獨佔
  • 讀鎖:讀取共享資料時由主執行緒獲取,允許並發讀,但阻止寫。

使用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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn