为了账号安全,请及时绑定邮箱和手机立即绑定

在go中访问struct的不同成员是否线程安全?

在go中访问struct的不同成员是否线程安全?

Go
翻阅古今 2021-09-27 17:35:42
从不同的 goroutine 访问不同的结构成员是否安全?我知道在没有同步的情况下写入同一个变量是危险的:package maintype Apple struct {    color string    size  uint}func main() {    apple := &Apple{}    go func() {        apple.color = "red"    }()    go func() {        apple.color = "green"    }()}但是你可以在没有任何同步的情况下写入不同的结构成员吗?package maintype Apple struct {    color string    size  uint}func main() {    apple := &Apple{}    go func() {        apple.color = "red"    }()    go func() {        apple.size = 42    }()}或者我应该使用chan或sync.Mutex为此?
查看完整描述

1 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

从不同的线程访问不同的变量应该是安全的,结构成员是不同的变量。所以是的,它应该是安全的。

但是,它可能不会很快。像结构成员一样在内存中靠得很近的变量将共享一个 CPU 缓存行。缓存线是 CPU(以及大多数当前型号)可以锁定的最小内存块。这意味着 CPU-2 必须等到 CPU-1 完成该缓存行后再写入,即使它们正在写入不同的变量。

从不同线程写入结构时更改指向结构的指针是不安全的。在您的示例中,如果您有第三个 goroutineapple = &Apple{}执行其他线程中的其他一些 goroutine,则可能会写入旧 Apple 或新 Apple,而您不会知道。


查看完整回答
1 反对 回复 2021-09-27
  • 1 回答
  • 0 关注
  • 343 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信