【发布时间】:2016-02-16 11:17:04
【问题描述】:
Go 的 map 据说不是 goroutine-safe(参见 here 和 here)。我有兴趣了解在我忽略使用互斥锁/等保护对地图的访问的情况下会发生什么。
具体来说,是否会发生以下任何情况?
- 假设我有一个带有键
k1、k2、...、kn的地图,当我要求map[kj](i != j) 时,并发问题会导致得到map[ki]吗? - 它会导致应用程序中的
panic吗?
【问题讨论】:
-
你会破坏内存。在 go 1.6 中,当检测到这种情况时,它会故意使程序崩溃以防止不安全的行为。一个 map 不能安全地并发使用并不重要,没有任何值可以安全地在 go 中并发读写。
-
确实没有必要知道您的具体问题的答案。你的代码坏了。破碎,不是“破碎但以这种特定方式破碎,在这种情况下是可以的”。刚刚坏了。
-
@JimB 谢谢。不用说,我知道这一点,否则我不会链接到上述来源。我实际上已经写了这个 repo 来处理它:github.com/streamrail/concurrent-map 但是我从来没有能够证明这个问题,这就是我问上面的原因。任何可以回答我的问题的代码参考将不胜感激。
-
唯一普遍的答案是,就像任何竞争条件一样,任何事情都可能发生。尤其是使用地图,一旦它损坏,您就可以从程序内存中的任何位置进行读写。每当有人遇到“奇怪的运行时错误”时,它几乎总是一场数据竞赛。
标签: multithreading go thread-safety