在Go
中使用并发程序时,我们使用var mutex sync.Mutex
然后如果我们必须编写执行某些同步代码块,我们会调用mutex.Lock()
和mutex.Unlock()
。现在我有一些疑问:
1)是否只有mutex
的一个实例,即如果mutex
用于锁定CodeBlockA的操作,同时其他一些goroutine B
必须使用它其他一些也使用mutex
的CodeBlockB会被goroutine B
阻止,直到goroutine A
解除mutex
。
2)我们是否有可能拥有更多的静音实例来保护他们自己的专用代码块。
答案 0 :(得分:0)
在编写示例代码作为参考时,我得到了答案。如果我们有def Pace():
ser.write(struct.pack('!BB',var1,var2)
,则var mu sync.Mutex
的锁定和解锁将被序列化。它不能同时锁定在两个可能完全独立的代码库的地方。但如果我们有mu
和var mu1 sync.Mutex
,则可以同时锁定var mu2 sync.Mutex
和mu1
。以下是POC的一个小程序:
mu2
运行后,
输入代码2
输入代码1
退出代码2
退出代码1
真正的0m1.335s
用户0m0.307s
sys 0m0.069s