首頁 > 後端開發 > Golang > 如何安全地讀取 Go 中不同 Goroutine 的值?

如何安全地讀取 Go 中不同 Goroutine 的值?

Barbara Streisand
發布: 2024-12-25 09:53:35
原創
413 人瀏覽過

How to Safely Read Values from Different Goroutines in Go?

從不同執行緒讀取值安全嗎?

在Go中,當涉及多個goroutine時,對值的安全並發存取需要同步,尤其是當其中至少有一個執行寫入操作。在給定的場景中,有必要實現同步以防止未定義的行為。

推薦方法:利用互斥體

通道雖然是訊息傳遞的一個選項,但可能會引入由於主執行緒中訊息檢索所需的同步,帶來了不必要的複雜性。相反,建議使用讀寫互斥體 (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套件提供原子操作,可以對特定資料類型(例如整數)進行無同步修改。它透過將讀取和修改操作限制為其原子函數來確保完整性。

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)
}

func (w *Worker) incIter() {
    atomic.AddInt64(&w.iter, 1)
}
登入後複製

這種方法提供了更簡單的同步機制,但請注意,它僅適用於特定資料類型。

透過採用使用這些方法之一,您可以安全地從不同執行緒中的工作執行緒讀取值,確保資料完整性並避免未定義的行為。

以上是如何安全地讀取 Go 中不同 Goroutine 的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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