2016-07-11 2 views
-2

Go의 동시 프로그램으로 작업 할 때 var mutex sync.Mutex을 사용하고 동기화 된 코드 블록을 작성해야한다면 mutex.Lock()mutex.Unlock()을 호출합니다. 지금은 여기에 몇 가지 의문이 있습니다sync.Mutex는 동시 Golang 프로그램에서 어떻게 작동합니까?

1) mutex이 CodeBlockA의 작업에 잠금에 사용되는 경우 mutex 즉, 하나의 인스턴스 만이, 그리고 다른 goroutine B이 다른 CodeBlockB을 위해 사용하는 동시에 그 또한 mutex을 사용하면 goroutine Bgoroutine 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() 
} 

는 그리고 그것을 실행 한 후,

는 CODE2

입력 코드 1

종료 CODE2

종료

실제 코드 1을 입력 0m1.335s

사용자 0m0.307s에 sys 0m0.069s

관련 문제