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

orc*_*man -1 multithreading thread-safety go

map据说Go不是goroutine-safe(见这里这里)。我有兴趣找出在我忽略使用互斥锁/等保护对地图的访问的情况下会发生什么。

具体来说,是否会发生以下任何一种情况?

  1. 假设我有一个带有键k1, k2, ...,的映射,当我请求(i != j)时kn,并发问题会导致 get吗?map[ki]map[kj]
  2. 它会导致panic应用程序中的 a 吗?

Mik*_*ear 5

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

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

// Global variable defining a map
var safemap = struct {
    sync.RWMutex
    m map[string]string
}{m: make(map[string]string)}
Run Code Online (Sandbox Code Playgroud)

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

// Get a read lock, then read from the map
safemap.RLock()
defer safemap.RUnlock()
return safemap.m[mykey] == myval
Run Code Online (Sandbox Code Playgroud)

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

// Delete from the map
safemap.Lock()
delete(safemap.m, mykey)
safemap.Unlock()
Run Code Online (Sandbox Code Playgroud)

或这个:

// Insert into the map
safemap.Lock()
safemap.m[mykey] = myval
safemap.Unlock()
Run Code Online (Sandbox Code Playgroud)