读写结构体数据数据互斥访问问题

weixin_38049686 2019-09-20 10:08:25
一个结构体中如果有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)
}
```
...全文
12 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
weixin_38075916 2019-09-20
  • 打赏
  • 举报
回复
waitgroup 。等add goroutine 全部执行完之后,再去读
weixin_38088281 2019-09-20
  • 打赏
  • 举报
回复
add全部执行完再读?意思是说不方便在Add一条数据后的间隙去读取数据了,只能等所有Add做完后才能读?
weixin_38092489 2019-09-20
  • 打赏
  • 举报
回复
你的add 不是顺序执行的,你可能先add 的5,但是你读取的时候,读的是4,你能读到吗?好好理解一下并发
weixin_38097791 2019-09-20
  • 打赏
  • 举报
回复
哦哦,明白了,谢谢指点!
weixin_38073387 2019-09-20
  • 打赏
  • 举报
回复
你添加的时候用的goroutine,读的时候也用的goroutine,你根本没有等他全部写进去再去读,所以读的时候偶尔有几个-1。简单来说,你没有等他写完就去读了,所以没读到。
weixin_38073465 2019-09-20
  • 打赏
  • 举报
回复
那该如何解决呢,我加了个无缓冲的通道,在Add函数的defer中给通道追加了1,然后在读数据的for循环中从通道取出数据,成功取出则查询之,怎么还是读到-1呢。

430

社区成员

发帖
与我相关
我的任务
社区描述
其他技术讨论专区
其他 技术论坛(原bbs)
社区管理员
  • 其他技术讨论专区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧