为了账号安全,请及时绑定邮箱和手机立即绑定

在 Go 中使用 map 时忽略 goroutine/thread-safety 的危险是什么?

在 Go 中使用 map 时忽略 goroutine/thread-safety 的危险是什么?

Go
泛舟湖上清波郎朗 2021-12-13 18:38:51
map据说Go不是goroutine-safe(见这里和这里)。我有兴趣找出在我忽略使用互斥锁/等保护对地图的访问的情况下会发生什么。具体来说,是否会发生以下任何一种情况?假设我有一个带有键k1, k2, ...,的映射,当我请求(i != j)时kn,并发问题会导致 get吗?map[ki]map[kj]它会导致panic应用程序中的 a 吗?
查看完整描述

1 回答

?
慕村9548890

TA贡献1884条经验 获得超4个赞

正如评论已经指出的那样,比赛很糟糕。与 Java 不同,Go 的保证非常弱,因此即使不执行包含竞争的代码,也允许具有任何竞争的程序具有未定义的行为。在 C 中,这称为“着火语义”。比赛的存在意味着任何结果都是可能的,包括您的计算机着火。


然而,在 Go 中很容易使地图线程安全。考虑以下:


// Global variable defining a map

var safemap = struct {

    sync.RWMutex

    m map[string]string

}{m: make(map[string]string)}

您可以像这样从地图中安全读取:


// Get a read lock, then read from the map

safemap.RLock()

defer safemap.RUnlock()

return safemap.m[mykey] == myval

你可以像这样进行安全的修改:


// Delete from the map

safemap.Lock()

delete(safemap.m, mykey)

safemap.Unlock()

或这个:


// Insert into the map

safemap.Lock()

safemap.m[mykey] = myval

safemap.Unlock()


查看完整回答
反对 回复 2021-12-13
  • 1 回答
  • 0 关注
  • 327 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号