如果我正确理解了它,那么您想要的是防止同时执行每个功能的某些部分和其他功能。下面的代码执行此操作:
fmt.Println在其他例程正在运行时,行不会发生。这就是发生的情况:当执行到达打印部分时,它将等待直到其他例程结束(如果它们正在运行),并且在执行此打印行时,其他例程将不会启动并等待。我希望这就是您想要的。如果我对此有误,请纠正我。
package mainimport ( "fmt" "rand" "sync")var ( mutex1, mutex2, mutex3 sync.Mutex wg sync.WaitGroup)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() wg.Done()}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() wg.Done()}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() wg.Done()}func main() { wg.Add(3) go Routine1() go Routine2() Routine3() wg.Wait()}更新
:让我在这里解释这三个互斥锁:一个互斥锁,如文档所述:“互斥锁”。这意味着当您调用
Lock互斥锁时,如果其他人已锁定相同的互斥锁,则代码仅在此处等待。在您致电后
Unlock,被阻止的代码将立即恢复。
在这里,我通过在函数的开头锁定互斥锁并将其解锁来将每个函数置于自己的互斥锁中。通过这种简单的机制,您可以避免与这些功能同时运行所需的任何代码部分。例如,在您想要拥有运行时不应该运行的代码的任何地方
Routine1,只需
mutex1在该代码的开头锁定并在末尾解锁即可。这就是我在
Routine2和中的适当行中所做的
Routine3。希望能澄清一些事情。



