【问题标题】: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 mutexgoroutine B 将被阻止直到 goroutine A 解除 mutex

2) 我们是否有可能拥有更多的静音实例来保护自己的专用代码块。

【问题讨论】:

  • 给我们看一些代码。

标签: multithreading go mutex goroutine


【解决方案1】:

在编写示例代码作为参考时,我得到了答案。如果我们有var mu sync.Mutex,那么mu 的锁定和解锁将被序列化。它不能同时锁定在两个可能是完全独立的代码库的地方。但是如果我们有var mu1 sync.Mutexvar mu2 sync.Mutex 那么mu1mu2 可以同时被锁定。以下是 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-10
    • 2014-08-11
    • 2017-04-20
    • 1970-01-01
    • 2019-04-11
    • 2017-10-01
    • 2011-05-05
    相关资源
    最近更新 更多