当覆盖m
具有并发写入者的地图时,包括可以从地图中删除的写入者,这样做不是线程安全的吗?:
for k, v := range m { ... }
我正在考虑线程安全我需要防止其他可能的编写者v
在我阅读它时更改值,并且(当使用互斥锁并且因为锁定是一个单独的步骤时)验证密钥k
是否仍在地图中. 例如:
for k := range m {
m.mutex.RLock()
v, found := m[k]
m.mutex.RUnlock()
if found {
... // process v
}
}
(假设其他作家m
在改变之前写锁定v
。)有更好的方法吗?
编辑添加:我知道地图不是线程安全的。但是,根据http://golang.org/ref/spec#For_statements上的 Go 规范,它们在某种程度上是线程安全的(搜索“如果在迭代期间删除尚未到达的映射条目”)。这个页面表明使用的代码range
不需要关心其他goroutines插入到map中或从map中删除。我的问题是,这种线程安全性是否扩展到v
,这样我就可以v
只读使用 onlyfor k, v := range m
没有其他线程安全机制?我创建了一些测试代码来试图强制应用程序崩溃以证明它不起作用,但即使是公然运行线程不安全的代码(许多 goroutines 在没有锁定机制的情况下疯狂地修改相同的映射值)我不能去崩溃!