欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 房产 > 家装 > go sync包(三) 读写锁(一)

go sync包(三) 读写锁(一)

2024/10/24 1:53:48 来源:https://blog.csdn.net/2401_82869454/article/details/139922567  浏览:    关键词:go sync包(三) 读写锁(一)

读写锁 RWMutex

读操作是天生的幂等操作,因为不涉及到数据的修改,如果在一个读多写少的场景使用普通的互斥锁,每个读、写操作都要加索,会影响性能。

type RWMutex struct {w           Mutex        // held if there are pending writerswriterSem   uint32       // semaphore for writers to wait for completing readersreaderSem   uint32       // semaphore for readers to wait for completing writersreaderCount atomic.Int32 // number of pending readersreaderWait  atomic.Int32 // number of departing readers
}// Happens-before relationships are indicated to the race detector via:
// - Unlock  -> Lock:  readerSem
// - Unlock  -> RLock: readerSem
// - RUnlock -> Lock:  writerSem
  • w:复用互斥锁。
  • writerSemreaderSem:信号量,分别用于写等待读和读等待写。
  • readerCount 表示当前正在执行的读 goroutine 数量,以及是否有 writer 竞争锁。
  • readerWait 表示写 goroutine 被阻塞时需要等待完成的读 goroutine 数量。

RWMutex 复用 Mutex,因此有与 Mutex一样的问题:

  1. 无法实现可重入锁。
  2. 可能锁会被其他 goroutine 释放。
    常见的错误场景:
    • Lock / Unlock 或 RLock / RUnlock不是成对出现
    • Copy 已使用的 RWMutex(不可以复制)
      原因:RWMutex 是一个有状态的字段,在并发环境下,状态时时在变化。
  • 重入
  • 死锁

RWMutex 适用在读多写少的场景,最常见的就是 map 有并发读写问题,用 RWMutex 进行读写保护。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com