【问题标题】:Does placing sync.Mutex in package level variable has any effects on package level maps?将 sync.Mutex 放在包级别变量中是否对包级别映射有任何影响?
【发布时间】:2021-10-19 15:13:30
【问题描述】:

在以下函数之一中调用 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...

【问题讨论】:

  • 互斥锁在其锁定和解锁之间锁定“代码块”。它不锁定变量。即互斥锁的锁定和解锁之间的代码不会被多个goroutine同时执行。
  • 不,两个完全不相关的变量不会对彼此做任何事情,无论它们在包内部/外部的可见性如何。该映射与互斥体没有任何关系。

标签: go locking mutex


【解决方案1】:

sync.Mutex 类型的变量上调用Lock 除了确保任何其他在同一变量上调用Lock 的goroutine 将暂停其执行,直到其他一些goroutine 在同一变量上调用Unlock

也就是说,您的思路是错误的:互斥锁本身不能保护任何程序状态。相反,它只是显式序列化对程序状态某些部分的访问的某种手段。
这些是哪些部分——由哪些代码访问它们决定,所有这些代码都应该使用一些商定的序列化这种访问的机制(它可以是互斥体或其他东西)。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2014-11-15
    • 2013-06-13
    • 1970-01-01
    • 2011-05-20
    相关资源
    最近更新 更多