【发布时间】:2014-05-17 15:42:42
【问题描述】:
有哪些好的做法可以防止 Go 中的竞争条件?
我唯一能想到的就是不在 goroutine 之间共享数据——父 goroutine 发送对象的深层副本而不是对象本身,因此子 goroutine 不能改变父 goroutine 可以改变的东西。这会占用更多的堆内存,但另一种选择是学习 Haskell:P
编辑:另外,有没有我上面描述的方法仍然会遇到竞争条件的情况?
【问题讨论】:
-
竞态条件很难调试,也很难掌握避免它们。我建议考虑 Rob Pike vimeo.com/49718712 在这里描述的模式,因为他通过某些构造来了解通道和 CSP 语义如何通过设计使应用程序安全,而不是担心与互斥锁相关的所有问题。很抱歉,如果这不能回答您的问题,但我希望它为新想法打开更多大门。
-
感谢您的链接。是的,竞争条件很难预防,但更难调试!我想集合的不可变版本会在一定程度上缓解这个问题,但是我们又回到了函数式编程的后院。
-
还有 其他基于不可变/函数式的语言(例如 F#),但它确实与风格有关。需要更多内存是对的,但适当的设计可以消除一些开销。例如,写入修改数组平均可以在
n log n空间(或对于某些潜在情况更少)完成,而不是天真的2n。尽管语言/优化器支持可以为专用语言做一些疯狂的事情......
标签: go race-condition deep-copy goroutine