将sync.Mutex放在包级别变量中对包级别映射有什么影响吗?

Mod*_*ody -2 mutex locking go

在以下函数之一中调用 mu.Lock() 是否会锁定包级 accCache 映射?

package cache

import (
    "sync"
)

type CachedAccount struct {
    Id       string
    Expires  int64
}


var accCache = make(map[string]CachedAccount)

var mu sync.Mutex


func addAccount...
func getAccount...

Run Code Online (Sandbox Code Playgroud)

kos*_*tix 5

调用Lock某个类型的变量sync.Mutex除了确保调用Lock同一变量的任何其他 goroutine 将暂停其执行,直到其他 goroutine 调用Unlock该同一变量之外,不会执行任何操作。

\n

也就是说,您的思路是错误的:互斥体本身并不保护任何程序状态。相反,它只是显式序列化对程序状态某些部分的访问的某种方法。
\n这些部分是\xe2\x80\x94,由访问它们的代码决定,所有这些代码都应该使用某种商定的机制来序列化此类访问(可以是互斥体或其他东西)。

\n

特别是因为这一点,有可能在代码中引入数据竞争:如果不是所有访问程序状态相同部分的代码路径都使用相同的同步机制,则存在数据竞争条件。

\n