Go maps 未能通过并发测试
Go maps fails the concurency test
当我运行以下代码时:
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)
我该如何解决这个问题?
我有很多并发写入和读取。
如果您查看竞争检测器显示的错误,您会看到它报告了 value = dictionary["Key"]
行上的并发写入,这意味着检测到的竞争是在 value
上,而不是 dictionary
.
您正在同时访问 2 个变量,dictionary
和 value
。您不能使用读锁来保护映射上的读取,并写入 value
变量。您要么需要第二个互斥锁,要么需要始终使用 mutex.Lock
来序列化对两个变量的访问。
此代码将正常工作:
go func() {
mutex.Lock()
value = dictionary["Key"]
mutex.Unlock()
}()
它保护变量 value 免受并发写入。
当我运行以下代码时:
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)
我该如何解决这个问题?
我有很多并发写入和读取。
如果您查看竞争检测器显示的错误,您会看到它报告了 value = dictionary["Key"]
行上的并发写入,这意味着检测到的竞争是在 value
上,而不是 dictionary
.
您正在同时访问 2 个变量,dictionary
和 value
。您不能使用读锁来保护映射上的读取,并写入 value
变量。您要么需要第二个互斥锁,要么需要始终使用 mutex.Lock
来序列化对两个变量的访问。
此代码将正常工作:
go func() {
mutex.Lock()
value = dictionary["Key"]
mutex.Unlock()
}()
它保护变量 value 免受并发写入。