gpt4 book ai didi

go - Golang 中 RWMutex.Lock() 的实现

转载 作者:IT王子 更新时间:2023-10-29 02:21:33 26 4
gpt4 key购买 nike

src/sync/rwmutex.go文件中,我们可以看到“Lock”的定义如下:

func (rw *RWMutex) Lock() {
if race.Enabled {
_ = rw.w.state
race.Disable()
}
// First, resolve competition with other writers.
rw.w.Lock()
// Announce to readers there is a pending writer.
r := atomic.AddInt32(&rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders
// Wait for active readers.
if r != 0 && atomic.AddInt32(&rw.readerWait, r) != 0 {
runtime_Semacquire(&rw.writerSem)
}
if race.Enabled {
race.Enable()
race.Acquire(unsafe.Pointer(&rw.readerSem))
race.Acquire(unsafe.Pointer(&rw.writerSem))
}
}

所以我真的很想知道

atomic.AddInt32(&rw.readerCount, -rwmutexMaxReaders) + rwmutexMaxReaders

这句话的意思。正如它所说,如何向读者宣布?怎么理解?

最佳答案

在 RWMutex 上,编写者调用 Lock 会阻止更多读者获取 RLock。这样做是为了防止 starvation的作家。

假设以下场景:

  1. 假设一个读者获得了读锁,那么rw.readerCount将为1。

  2. 然后写入器尝试获取写锁。在获得写锁 ( line 93 ) 之后,它现在必须向所有读者发送信号,表明作者正在等待(因此他们无法继续)并等待所有读者完成。通过将 rw.readerCount 设置为负值 (atomic.AddInt32(&rw.readerCount, -rwmutexMaxReaders)) 来设置信号。 rw.readerCount 的值现在是 1-rwmutexMaxReaders。请注意 r 不是 0,因此作者知道有读者仍在阅读。

  3. 一个新的 Reader 现在想要获取读锁,它将 rw.readerCount 加 1(第 48 行)并检查它是否为负数。如果是负数,是作者设置的,我们应该等待作者完成后再继续。

信号发生在 rw.readerCount 的符号周围。

关于go - Golang 中 RWMutex.Lock() 的实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46786900/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com