互斥的概念控制著程式中函數或程式碼區塊的同時執行。在多個例程獨立執行的並發程式環境中,保持互斥對於確保正確性和防止衝突至關重要。
問題:
考慮一個具有三個並發 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() ... }
等待群組與同步:
此外,也使用了等待群組(wg)來同步goroutine:
wg.Add(3) go Routine1() go Routine2() Routine3() wg.Wait()
結果:
透過此實現,關鍵部分的執行goroutine 將是互斥的。因此,每個例程中的列印操作不會重疊或交錯,從而防止競爭條件並產生預期的輸出。
以上是如何使用互斥體在並發 Goroutines 中實現互斥?的詳細內容。更多資訊請關注PHP中文網其他相關文章!