根据 Go 博客,
映射对于并发使用是不安全的:它没有定义当您同时读取和写入它们时会发生什么。如果您需要从并发执行的 goroutine 中读取和写入映射,则访问必须通过某种同步机制进行调解。(来源:https : //blog.golang.org/go-maps-in-action)
任何人都可以详细说明这一点吗?跨例程的并发读取操作似乎是允许的,但如果尝试读取和写入同一个键,并发读/写操作可能会产生竞争条件。
在某些情况下,这最后的风险可以降低吗?例如:
函数A生成k并设置m[k]=0。这是 A 写入映射 m 的唯一一次。已知 k 不在 m 中。
A 将 k 传递给同时运行的函数 B
A 然后读取 m[k]。如果 m[k]==0,则等待,仅当 m[k]!=0 时继续
B 在地图中寻找 k。如果找到,B 将 m[k] 设置为某个正整数。如果不是,它会等到 k 在 m 中。
这不是代码(显然),但我认为它显示了一种情况的轮廓,即使 A 和 B 都尝试访问 m 也不会有竞争条件,或者如果存在竞争条件也没关系,因为额外的约束。
开满天机
森栏
相关分类