2017-03-15 6 views
0

나는 다음과 같은 코드를 실행하면 :이동지도가 concurency 테스트를 실패

import (
"log" 
"sync" 
"testing" 
"time" 
) 
func TestConcurrency(t *testing.T) { 
var mutex sync.RWMutex 
dictionary := make(map[interface{}]interface{}) 
go func() { 
    var value interface{} 
    for { 
     go func() { 
      mutex.Lock() 
      dictionary["Key"] = "" 
      mutex.Unlock() 
     }() 

     go func() { 
      mutex.RLock() 
      value = dictionary["Key"] 
      mutex.RUnlock() 
     }() 

    } 
    log.Println(value) 
}() 
} 

사용 :

go test -race fileName.go 

그것은 결과를 :

Found 1 data race(s) 

어떻게이 문제를 해결할 수 있습니까?

많은 동시 쓰기 및 읽기가 있습니다.

답변

4

경주 발견자가 제시 한 오류를 보면 value = dictionary["Key"] 행에 동시 기록이보고되었음을 알 수 있습니다. 즉, 감지되는 경주가 이 아니라 dictionary입니다.

두 변수, dictionaryvalue을 동시에 액세스하고 있습니다. 읽기 잠금을 사용하여 맵에서 읽기를 보호하고 변수 value에 쓸 수 없습니다. 두 번째 뮤텍스가 필요하거나 항상 두 변수에 대한 액세스를 직렬화하려면 mutex.Lock을 사용해야합니다.

0

이 코드는 제대로 작동합니다

go func() { 
     mutex.Lock() 
     value = dictionary["Key"] 
     mutex.Unlock() 
    }() 

이 동시 쓰기에서 변수 를 보호합니다.