2016-07-11 18 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