并发 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中文网其他相关文章!