go routine同时操作同一个结构体会有问题吗?

gojuukaze · 2019-08-05 14:50:33 · 2091 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2019-08-05 14:50:33 的主题,其中的信息可能已经有所发展或是发生改变。

go routine同时对同一个结构的不同字段赋值会不会出问题, 大概像这样

type AA struct {
    A int
    B int
}

a:=AA{}

go func() {
    a.A=1
}()

go func() {
    a.B=2
}()

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

2091 次点击  
加入收藏 微博
6 回复  |  直到 2019-08-23 16:44:55
a7505553
a7505553 · #1 · 6年之前

这个是全局变量,整个包内共享,多个goroutine同时操作不是线程安全的,有这种情况建议加锁

huang2287832
huang2287832 · #2 · 6年之前

一般map和slice才会有问题, map会直接崩,slice虽然不会崩,但是数据可能会丢失

focussoft
focussoft · #3 · 6年之前

如果只读是没问题的, 写的话有问题.

BruceWangNo1
BruceWangNo1 · #4 · 6年之前

Go语言大佬Ross Cox的原话:“Don't communicate by sharing memory; Share memory by communicating."

在你的这里例子来看,不同的goroutine访问同一变量需要加锁。不过不推荐加锁,原因是影响性能。

107295472
107295472 · #5 · 6年之前
BruceWangNo1BruceWangNo1 #4 回复

Go语言大佬Ross Cox的原话:“Don't communicate by sharing memory; Share memory by communicating." 在你的这里例子来看,不同的goroutine访问同一变量需要加锁。不过不推荐加锁,原因是影响性能。

不加锁,有什么好办法

stayfoo
stayfoo · #6 · 6年之前

加锁的话可以使用互斥锁、读写锁,配合waitGroup,或者条件变量; 不加锁就是通过 chan , 当一个 goroutine 中操作完毕,发出信号,第二个再处理;

添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传