gpt4 book ai didi

golang sync.RWLock 似乎会造成死锁?

转载 作者:IT王子 更新时间:2023-10-29 01:42:54 26 4
gpt4 key购买 nike

我一直在使用 RWLock 读取 mysql 数据库,但似乎以下代码在等待解锁时间歇性地锁定程序?

// Returns string value from key in table specified, third parameter should be set to false if it shouldn't be case senstive.
func (self *DBStore) GetString(table string, key string, vargs...interface{}) (output string) {

defer func() { fmt.Println("GETSTRING Freeing Mutex!") }()
self.mutex.RLock()
fmt.Println("GETSTRING Got Mutex!")
defer self.mutex.RUnlock()

self.Get(table, key, &output, vargs...)
return

}

// Retreive a value at key in table specified.
func (self *DBStore) Get(table string, key string, output interface{}, vargs...interface{}) (found bool) {

defer func() { fmt.Println("GET Freeing Mutex!") }()
fmt.Println("Requesting Mutex")
self.mutex.RLock()
fmt.Println("GET Got Mutex!")
defer self.mutex.RUnlock()

现在有了上面的内容,我可以看到我真的不需要在这里执行 RLock,我可以简单地删除它,但我的印象是读锁不应该干扰另一个读锁。而且它似乎是间歇性的,在它再次发生之前我通常需要运行几次相同的东西。

程序的输出是:

Requesting Mutex
GET Got Mutex!
GET Freeing Mutex!
GETSTRING Got Mutex!
Requesting Mutex

然后它就永远坐着,锁着。我在这里缺少什么?

如有任何信息,我们将不胜感激!

go版本go1.4 darwin/amd64

最佳答案

后来想想背靠背RLock的问题,有道理。

我在这里没有记录的是锁,现在很清楚的是在背靠背 RLock 之间出现锁的情况。

基本上锁是排队的。

(Thread 1) GetString -> Request Read Lock
(Thread 1) GetString -> Got Read Lock
(Thread 2) Set -> Request Write Lock (Blocked, queued.)
(Thread 1) Get -> Request Read Lock (Blocked, queued.)

来自 http://golang.org/src/sync/rwmutex.go?s=862:888#L19

34        if atomic.AddInt32(&rw.readerCount, 1) < 0 {
35 // A writer is pending, wait for it.
36 runtime_Semacquire(&rw.readerSem)
37 }

关于golang sync.RWLock 似乎会造成死锁?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28081740/

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