2016-07-11 27 views
-2

Wenn es mit einem gleichzeitigen Programm in Go arbeitet, verwenden wir var mutex sync.Mutex und dann, wenn wir einen synchronisierten Codeblock schreiben ausführen, rufen wir mutex.Lock() und mutex.Unlock(). Jetzt habe ich einige Zweifel hier:Wie funktioniert sync.Mutex Arbeit in einem gleichzeitigen Golang Programm

1) Gibt es nur eine Instanz von mutex dh wenn mutex zur Verriegelung für den Betrieb von CodeBlockA verwendet wird, und zugleich einige andere goroutine B hat es für einige andere CodeBlockB zu verwenden, die benutzt auch mutex, wird goroutine B blockiert bis goroutine A entlastet mutex.

2) Ist es möglich, dass wir mehr Instanzen der Stummheit haben können, die ihre eigenen dedizierten Codeblöcke schützen?

+1

zeigen uns einige Code. – OneOfOne

Antwort

0

Während ich den Beispielcode als Referenz schrieb, bekam ich die Antwort. Wenn wir var mu sync.Mutex haben, wird das Sperren und Entsperren von mu serialisiert. Es kann nicht gleichzeitig an zwei Stellen gesperrt werden, die völlig unabhängige Codebasen sein könnten. aber wenn wir var mu1 sync.Mutex und var mu2 sync.Mutex haben, können mu1 und mu2 gleichzeitig gesperrt werden. Es folgt ein kleines Programm für den 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() 
} 

Und nachdem es läuft,

Eingabe code2

Eingabe code1

verlassen code2

verlassen code1

Echt 0m1.335s

Benutzer 0m0.307s

sys 0m0.069s