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

显示一些代码。