使用RWMutex代替Mutex有什么好处?

Ale*_*lex 14 go

我不确定何时使用RWMutex以及何时使用Mutex.

如果您使用RWMutex而不是Mutex,如果您执行更多读取然后写入,您是否节省了资源?

我看到有些人不管他们做什么都会一直使用Mutex,有些人使用RWMutex并运行这些方法:

func (rw *RWMutex) Lock()
func (rw *RWMutex) Unlock()
func (rw *RWMutex) RLock()
func (rw *RWMutex) RUnlock()
Run Code Online (Sandbox Code Playgroud)

而不只是:

func (m *Mutex) Lock()
func (m *Mutex) Unlock()
Run Code Online (Sandbox Code Playgroud)

如果您节省了资源,那么如果您执行更多读取然后写入,那么您应该使用RWMutex吗?

Pet*_*ter 19

文档(强调我的):

RWMutex是读/写互斥锁.锁可以由任意数量的读者或单个作者持有.RWMutex的零值是解锁的互斥锁.

换句话说,读者不必彼此等待.他们只需要等待持有锁的作家.

因此,sync.RWMutex对于主要读取的数据是优选的,并且与sync.Mutex相比节省的资源是时间.

  • “如果一个 Goroutine 持有 RWMutex 进行读取,并且另一个 Goroutine 可能调用 Lock,则在释放初始读锁之前,任何 Goroutine 都不应该期望能够获取读锁。特别是,这会禁止递归读锁定。这是为了确保锁最终变得可用;阻塞的 Lock 调用会阻止新的读取者获取锁。” -来自文档的这些行...您能详细说明一下吗? (3认同)

Doo*_*ors 5

因为只读函数不会改变文件内容,所以可以允许多个读者同时读取同一个文件,以提高程序的效率。

写入活动会改变文件内容,因此需要互斥访问,否则会导致不可例外的错误。

关键是要了解使用读写锁时会发生什么。这是一个博客来解释这一点:

  1. 当写锁已被锁定时再次尝试锁定写锁会阻塞当前的goroutine
  2. 在写锁锁定的情况下再次尝试锁定读锁也会阻塞当前的goroutine
  3. 在读锁被锁定的情况下尝试锁定写锁也会阻塞当前的 goroutine
  4. 读锁已锁定后尝试锁定读锁不会阻塞当前 goroutine