並發Goroutine 中的互斥:實現程式碼隔離
在並發程式設計中,建立防止多個Goroutine 執行的機制至關重要同時使用相同的程式碼。這可以確保資料完整性並防止意外行為。
考慮以下場景:
<code class="go">Routine 1 { do something *Send int to Routine 2 Send int to Routine 3 Print Something Print Something* do something } Routine 2 { do something *Send int to Routine 1 Send int to Routine 3 Print Something Print Something* do something } Routine 3 { do something *Send int to Routine 1 Send int to Routine 2 Print Something Print Something* do something }</code>
這裡,當 do some 標記之間的程式碼部分正在執行時,我們希望防止控制流向其他 goroutine。例如,當 Routine1 執行星號內的部分時,Routine2 和 Routine3 應該會被阻止。
透過 WaitGroup 實現互斥
強制互斥的一種方法是使用sync.WaitGroup。然而,這種技術在這種情況下並不適用,因為它缺乏選擇性地阻止 goroutine 的能力。
利用互斥體進行隔離
更有效的解決方案是使用同步.互斥體。互斥體確保在任何給定時間只有一個 Goroutine 可以擁有它。以下是如何使用互斥體來實現互斥:
<code class="go">package main import ( "fmt" "sync" ) var ( mutex1, mutex2, mutex3 sync.Mutex ) func Routine1() { mutex1.Lock() // do something for i := 0; i < 200; i++ { mutex2.Lock() mutex3.Lock() fmt.Println("value of z") mutex2.Unlock() mutex3.Unlock() } // do something mutex1.Unlock() } func Routine2() { mutex2.Lock() // do something for i := 0; i < 200; i++ { mutex1.Lock() mutex3.Lock() fmt.Println("value of z") mutex1.Unlock() mutex3.Unlock() } // do something mutex2.Unlock() } func Routine3() { mutex3.Lock() // do something for i := 0; i < 200; i++ { mutex1.Lock() mutex2.Lock() fmt.Println("value of z") mutex1.Unlock() mutex2.Unlock() } // do something mutex3.Unlock() } func main() { go Routine1() go Routine2() Routine3() }</code>
在這段程式碼中:
因此,每個 goroutine 內的 print 語句將一次執行一個,確保沒有其他 goroutine 可以存取這些行,直到當前 Goroutine 已釋放鎖。
以上是如何使用互斥體確保並發 Goroutines 中的互斥?的詳細內容。更多資訊請關注PHP中文網其他相關文章!