2016-07-11 1 views
-2

Goで並行プログラムを使用する場合、var mutex sync.Mutexを使用し、同期コードブロックを実行する必要がある場合は、mutex.Lock()mutex.Unlock()を呼び出します。今私はここにいくつかの疑問を持っている:sync.Mutexは同時実行のGolangプログラムでどのように動作するのですか

1)mutexはCodeBlockAの操作にロックするために使用されている場合mutexすなわちのインスタンスが1つだけあり、および他のいくつかのgoroutine Bは、いくつかの他のCodeBlockBのためにそれを使用するために持っていると同時に、そのまた、mutexを使用します。goroutine Bは、goroutine Aの緩和mutexまでブロックされます。

2)独自の専用コードブロックを保護している可能性があります。

+1

私たちにいくつかのコードを示しています。 – OneOfOne

答えて

0

参考としてサンプルコードを書いているうちに、私は答えを得ました。 var mu sync.Mutexがある場合は、muのロックとロック解除がシリアル化されます。完全に独立したコードベースである可能性がある2つの場所で同時にロックすることはできません。 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() 
} 

は、それを実行した後、

はCODE2

入力CODE1

終了コード2

終了

本当CODE1を入力します0m1.335s

ユーザー0m0.307s

のsys 0m0.069s

関連する問題