请教 Golang 并发读写的问题

2022-11-01 13:53:19 +08:00
 yaott2020
现在有个变量 a (type A struct{} 且 var a *A) ,想要动态修改 a 的字段 b (var b string) ,在同时多个 goroutine 读的情况下写入会不会不安全?把 b 的类型换成 func() 呢?
1790 次点击
所在节点    Go 编程语言
9 条回复
zmcity
2022-11-01 14:02:05 +08:00
看看你的场景是不是要求严格时序一致的了,如果是的话加读写锁。
yaott2020
2022-11-01 14:38:28 +08:00
放弃了,按照我的需求好像做不到。。。
yjhatfdu2
2022-11-01 14:48:57 +08:00
可以使用 atomic
lanlanye
2022-11-01 15:25:20 +08:00
多个读一个写的话,写入不会有冲突
rrfeng
2022-11-01 16:01:43 +08:00
多个写会冲突,读哪有冲突一说。。。

顶多是读到你预期之外的数据(你以为写了但还没写完)
yaott2020
2022-11-01 18:55:42 +08:00
@rrfeng 如果没写完 func 又有 goroutine 执行是不是有可能 panic 退出
linghutf
2022-11-02 11:11:31 +08:00
两种方式:
1. 写时加写锁,读时加读锁
2. 把 a 放在 channel 中在 goroutine 间共享,谁拿到就可以操作
yaott2020
2022-11-02 11:54:28 +08:00
@linghutf 就是不想加锁以及 channel ,看看有没有什么原子操作可以做到,好像找不到
lysS
2022-11-02 12:33:39 +08:00
@lanlanye 这种是不安全的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/891753

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX