在我的执行代码中,我没有。需要互斥的结构:
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/