map写入源代码写冲突

在map写入的时候,源代码有段如下

if h.flags&hashWriting != 0 {
    throw("concurrent map writes")
}
hash := t.hasher(key, uintptr(h.hash0))

h.flags ^= hashWriting

上面的作用应该是避免写冲突,但是我看着如果两个goroutine一起进来,h.flags&hashWriting并不会把它们拦住,前后脚进入h.flags ^= hashWriting,最终h.flags的hashWriting位变成0了,也达不到避免写冲突的效果,这么理解是哪里不对?

最佳答案

并发检查:
1.h.flags&hashWriting != 0
h.flags默认为0,此时条件判断为false
若flags不为0,则已有gorountine在修改map,throw("concurrent map writes")
2.确认无同时写后更新flags值-h.flags^= hashWriting,此时flags改为4
3.携入完成时再次检查
h.flags&hashWriting == 0
此时flags应仍为4,说明无其他gorountine操作,结果为false
若flags已被重置为0,则说明发生并发操作,throw("concurrent map writes")
4.重置flags为0 h.flags&^= hashWriting

简单的保证不会同时有多个gorountine进行数据操作

3年前 评论
讨论数量: 1

并发检查:
1.h.flags&hashWriting != 0
h.flags默认为0,此时条件判断为false
若flags不为0,则已有gorountine在修改map,throw("concurrent map writes")
2.确认无同时写后更新flags值-h.flags^= hashWriting,此时flags改为4
3.携入完成时再次检查
h.flags&hashWriting == 0
此时flags应仍为4,说明无其他gorountine操作,结果为false
若flags已被重置为0,则说明发生并发操作,throw("concurrent map writes")
4.重置flags为0 h.flags&^= hashWriting

简单的保证不会同时有多个gorountine进行数据操作

3年前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!