go - 有大量互斥体有副作用吗?

标签 go mutex

在我的执行代码中,我没有。需要互斥的结构:

type vitalMacs struct {
        mu   *sync.RWMutex
        macs map[string]bool
}

//macInfo would store oui info
type macInfo struct {
        mu       *sync.RWMutex
        infoDict map[string]*string
}

var (
        NetOPMutex  sync.RWMutex
        ipMacGlobal = make(map[string]string)
        macInfoVar  = macInfo{mu: &NetOPMutex}
        vitalMacsVar = vitalMacs{mu: &NetOPMutex}
        //vitalMacsVar = vitalMacs{mu: &sync.RWMutex{}} // <- like this 
)
我可以对所有这些都使用NetOPMutex,或者将新的互斥锁设置为&sync.RWMutex{}-这让我感到奇怪:
在您的代码中使用大量互斥体是否有副作用?
没有试图避免互斥,您必须保护自己,而不必担心。
我知道,如果我使用单个互斥锁,事情将不得不彼此等待并且玩得很好。另一方面,拥有大量不同的互斥锁(30+)是否会表现为更高的cpu util或用户与内核模式下的时间更长等?

最佳答案

sync.Mutex sync.RWMutex 是结构类型,具有互斥量与具有普通结构值相同。您的应用程序中有许多结构值是否有副作用?很明显不是。
创建互斥锁不涉及魔术。这等效于仅创建一个结构值。
使用互斥锁也不涉及魔术。检查源: Mutex.Lock() Mutex.Unlock() 。它们不会启动goroutine或执行消耗CPU的操作。
不要仅使用单个互斥锁来保存/备用内存。如果合适,请使用多个互斥锁来减少/减轻锁的争用。

关于go - 有大量互斥体有副作用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62687954/

相关文章:

c++ - boost::recursive_mutex::scoped_locks 析构函数会引用未锁定的互斥量吗?

dictionary - 是否可以在创建新映射时初始化映射的值?

string - Web Assembly 绘制灰色 Canvas

go - Unix 时间在 GOLANG 中返回 0 或某个小值

javascript - JavaScript 中的互斥量——这看起来像是一个正确的实现吗?

c++ - 访问类成员而不复制此变量或互斥变量

go - Go 中文件名的约定是什么?

json - 取消具有可变数量的相似字段的 JSON 对象

c++ - 混合 pthread.h 和 C++11 标准库线程功能是否安全?

c - 如何使用 pthread 在线程之间同步,其中一个是计时器?