【问题标题】:How does sync.Mutex work in a concurrent Golang programsync.Mutex 如何在并发 Golang 程序中工作
【发布时间】:2016-11-12 21:57:24
【问题描述】:
在Go 中使用并发程序时,我们使用var mutex sync.Mutex,然后如果我们必须编写执行一些同步代码块,我们调用mutex.Lock() 和mutex.Unlock()。现在我在这里有一些疑问:
1) 是否只有一个mutex 实例,即如果mutex 被用于锁定CodeBlockA 的操作,同时其他一些goroutine B 必须将它用于也使用的其他一些CodeBlockB mutex,goroutine B 将被阻止直到 goroutine A 解除 mutex。
2) 我们是否有可能拥有更多的静音实例来保护自己的专用代码块。
【问题讨论】:
标签:
multithreading
go
mutex
goroutine
【解决方案1】:
在编写示例代码作为参考时,我得到了答案。如果我们有var mu sync.Mutex,那么mu 的锁定和解锁将被序列化。它不能同时锁定在两个可能是完全独立的代码库的地方。但是如果我们有var mu1 sync.Mutex 和var mu2 sync.Mutex 那么mu1 和mu2 可以同时被锁定。以下是 POC 的一个小程序:
package main
import (
"fmt"
"sync"
"time"
)
var mu sync.Mutex
var mu1 sync.Mutex
var wg sync.WaitGroup
// var anotherBalance int
func code1() {
mu.Lock()
defer mu.Unlock()
fmt.Println("Entering code1")
time.Sleep(1 * time.Second)
fmt.Println("Exiting code1")
}
func code2() {
mu1.Lock()
defer mu1.Unlock()
fmt.Println("Entering code2")
time.Sleep(1 * time.Second)
fmt.Println("Exiting code2")
}
func main() {
wg.Add(1)
go func() {
code1()
wg.Done()
}()
wg.Add(1)
go func() {
code2()
wg.Done()
}()
wg.Wait()
}
运行之后,
输入代码2
输入代码1
退出代码2
退出代码1
真正的 0m1.335s
用户 0m0.307s
系统 0m0.069s