首頁  >  文章  >  後端開發  >  如何使用互斥體在並發 Goroutines 中實現互斥?

如何使用互斥體在並發 Goroutines 中實現互斥?

Susan Sarandon
Susan Sarandon原創
2024-10-30 05:50:28541瀏覽

How can you achieve mutual exclusion in concurrent Goroutines using Mutexes?

使用互斥量的並發 Goroutine 中的互斥

互斥的概念控制著程式中函數或程式碼區塊的同時執行。在多個例程獨立執行的並發程式環境中,保持互斥對於確保正確性和防止衝突至關重要。

問題:
考慮一個具有三個並發 goroutine 的場景(例程1、2 和 3),它們交換資料並執行列印操作。目標是確保當任何 goroutine 中的特定程式碼部分正在執行時,其他 goroutine 中的執行會停止,直到該部分完成。

使用互斥體的解決方案:
互斥體,一個基本的同步原語,可以用來實現 goroutine 中的互斥。互斥體提供了一種鎖定機制,一次只允許一個 goroutine 存取程式碼的關鍵部分。

在提供的程式碼片段中,引入了三個互斥體(mutex1、mutex2 和mutex3):

var (
    mutex1, mutex2, mutex3 sync.Mutex
    wg sync.WaitGroup
)

每個goroutine 在執行臨界區之前都會取得對應的互斥鎖,如修改後的程式碼所示:

func Routine1() {
    mutex1.Lock()
    // do something
    ...
    // do something
    mutex1.Unlock()
    ...
}

func Routine2() {
    mutex2.Lock()
    ...
    // do something
    ...
    mutex2.Unlock()
    ...
}

func Routine3() {
    ...
    mutex3.Lock()
    // do something
    ...
    mutex3.Unlock()
    ...
}
  • Routine1 在執行臨界區時取得mutex1,從而阻止其他例程的執行存取此部分。
  • 程式 2 取得互斥體 2,確保其關鍵部分的獨佔執行。
  • 例程 3 取得互斥體 3 以控制對其關鍵部分的存取。

等待群組與同步:
此外,也使用了等待群組(wg)來同步goroutine:

wg.Add(3)
go Routine1()
go Routine2()
Routine3()
wg.Wait()
  • Add方法將等待群組的計數器增加3 ,表示三個Goroutine 即將執行。
  • go 語句 запускает Routine1 和 Routine2 並發。
  • Routine3 在目前執行緒執行。
  • Wait 方法會阻塞直到等待群組計數器達到零,確保所有 goroutine 在主函數繼續之前已完成執行。

結果:
透過此實現,關鍵部分的執行goroutine 將是互斥的。因此,每個例程中的列印操作不會重疊或交錯,從而防止競爭條件並產生預期的輸出。

以上是如何使用互斥體在並發 Goroutines 中實現互斥?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

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