2016-07-11 24 views
-2

当使用Go中的并发程序时,我们使用var mutex sync.Mutex,然后如果我们必须写入执行一些同步代码块,我们将调用mutex.Lock()mutex.Unlock()。现在我有些怀疑这里:sync.Mutex如何在并发Golang程序中工作

1)是否存在的mutex即只有一个实例,如果正在使用mutex被锁定为CodeBlockA的操作,并在同一时间其他一些goroutine B必须使用它的一些其他CodeBlockB说还使用mutex,将goroutine B屏蔽,直到goroutine A解除mutex

2)有可能我们可以有更多的静音守护自己的专用代码块的实例。

+1

向我们展示一些代码。 – OneOfOne

回答

0

在写示例代码作为参考时,我得到了答案。如果我们有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

SYS 0m0.069s