go - 为什么 sync.Mutex 存在?
问题描述
为什么sync.Mutex
在我们有的时候存在sync.RWMutex
?我可以锁定/解锁 rw 互斥锁。它们之间的主要区别是什么?
解决方案
确实,您可以sync.RWMutex
在需要时使用 a sync.Mutex
。
我认为两者都存在,因为在很多情况下 async.Mutex
就足够了(您不需要读写级别锁定),并且实现sync.Mutex
更简单:需要更少的内存并且很可能更快。
sync.Mutex
只有 8 个字节:
type Mutex struct {
state int32
sema uint32
}
Whilesync.RWMutex
是 8 + 16 = 24 字节(包括 a sync.Mutex
):
type RWMutex struct {
w Mutex // held if there are pending writers
writerSem uint32 // semaphore for writers to wait for completing readers
readerSem uint32 // semaphore for readers to wait for completing writers
readerCount int32 // number of pending readers
readerWait int32 // number of departing readers
}
是的,您可以说 8 或 24 字节无关紧要。只要您只有几个互斥锁,它就不会。
但是将互斥体放入它应该保护的结构中并不少见(嵌入或常规的命名字段)。现在,如果您拥有这些结构值的一部分,甚至可能有数千个,那么是的,它将产生明显的不同。
此外,如果您只需要一个互斥锁,sync.Mutex
那么您滥用它的机会就会减少(您不会意外调用RLock()
,因为它没有该方法)。
推荐阅读
- ajax - Bootstrap-table 通过 Ajax 调用 dotnet core 3.1 Razor Pagemodel
- css - 如何使用 css 以角度调整垫子对话框宽度?
- capybara - 如何忽略 Capybara 中的可访问性隐藏文本
- python - 'MyGrid' 对象没有属性 'pressed'
- wpf - 将枚举与 DataTriggers 一起使用
- opencv - opencv K-Means 理解中心矩阵
- ios - iOS单元测试中的期望失败
- c# - (Hackerrank - Fair Rations)当返回字符串时出现以下错误(C#)。错误 CS0029:无法将类型 string' 隐式转换为 int
- c# - GTK# Textview 用于行号
- sql-server - 在 Sql Server 表中的新记录上通知 Ms Access 应用程序