一个结构体中如果有map类型的属性时,为保证读写时的互斥添加RWMutex了,但读出时因为等待问题出现了取不到数据(打印-1)情况,请问如何解决,代码如下:
```golang
type UserAges struct {
ages map[string]int
sync.RWMutex
}
func (ua *UserAges) Add(name string, age int) {
ua.Lock()
defer ua.Unlock()
ua.ages[name] = age
}
func (ua *UserAges) Get(name string) int {
ua.RLock()
defer ua.RUnlock()
if age, ok := ua.ages[name]; ok {
return age
}
return -1
}
func main() {
ua := &UserAges{ages: make(map[string]int)}
for i := 0; i < 10; i++ {
go func(i int) {
ua.Add("xiaohong"+fmt.Sprintf("%d", i), i)
}(i)
}
for i := 0; i < 10; i++ {
go func(i int) {
fmt.Println(ua.Get("xiaohong" + fmt.Sprintf("%d", i)))
}(i)
}
<-time.After(time.Second * 2)
}
```
你添加的时候用的goroutine,读的时候也用的goroutine,你根本没有等他全部写进去再去读,所以读的时候偶尔有几个-1。简单来说,你没有等他写完就去读了,所以没读到。
#1
更多评论
那该如何解决呢,我加了个无缓冲的通道,在Add函数的defer中给通道追加了1,然后在读数据的for循环中从通道取出数据,成功取出则查询之,怎么还是读到-1呢。
#2