Multithreading sync.Mutex如何在并发Golang程序中工作
在Multithreading sync.Mutex如何在并发Golang程序中工作,multithreading,go,mutex,goroutine,Multithreading,Go,Mutex,Goroutine,在Go中处理并发程序时,我们使用var mutex sync.mutex,然后如果我们必须编写并执行一些同步的代码块,我们调用mutex.Lock()和mutex.Unlock()。现在我有一些疑问: 1) 是否只有一个mutex实例,即如果mutex用于锁定代码块A的操作,同时其他一些goroutine B必须将其用于其他一些也使用mutex的代码块B,将阻止goroutine B直到goroutine A解除mutex 2) 我们是否可能有更多的静音实例来保护它们自己的专用代码块 在编写示例
Go
中处理并发程序时,我们使用var mutex sync.mutex
,然后如果我们必须编写并执行一些同步的代码块,我们调用mutex.Lock()
和mutex.Unlock()
。现在我有一些疑问:
1) 是否只有一个mutex
实例,即如果mutex
用于锁定代码块A的操作,同时其他一些goroutine B
必须将其用于其他一些也使用mutex的代码块B,将阻止goroutine B
直到goroutine A
解除mutex
2) 我们是否可能有更多的静音实例来保护它们自己的专用代码块 在编写示例代码作为参考时,我得到了答案。如果我们有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
用户0.307s
sys 0m0.069s显示一些代码。