2017-03-15 4 views
0

私は、次のコードを実行すると:ゴーマップは並行性テストに失敗した

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"]行の同時書き込みが報告されていることがわかります。これは、レースが検出されたことを意味します。valueではなく、dictionaryです。

2つの変数dictionaryvalueに同時にアクセスしています。読み取りロックを使用してマップ上の読み取りを保護することはできず、value変数に書き込みます。 2番目のミューテックスが必要な場合、または両方の変数へのアクセスをシリアル化する場合は、常にmutex.Lockを使用する必要があります。

0

このコードは正しく動作します:

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

をそれは同時書き込みから変数を保護します。

関連する問題