我一直在編寫(xiě)一個(gè)小型微服務(wù),以便熟悉Go及其并發(fā)機(jī)制。在我的程序中,我有一個(gè)具有狀態(tài)的結(jié)構(gòu),并且我想同步該狀態(tài),以便多個(gè)goroutine能夠讀取它,但當(dāng)另一個(gè)goroutine正在更新該狀態(tài)時(shí),則不能。最初,我認(rèn)為RWMutax是我需要的,但是根據(jù)文檔,只有一個(gè)goroutine可以在任何給定的哀悼中獲得讀鎖定。我要說(shuō)這句話:“如果一個(gè) goroutine 拿著一個(gè) RWMutex 進(jìn)行讀取,而另一個(gè) goroutine 可能會(huì)調(diào)用 Lock,那么在釋放初始讀鎖定之前,沒(méi)有 goroutine 應(yīng)該能夠獲得讀鎖定。有沒(méi)有辦法在不獲取鎖的情況下等待互斥鎖?大致如下:type stateful struct { state int stateMutex sync.Mutex beingUpdated bool}type Stateful interface { GetState() int SetState(st int)}func createStateful (sa string) stateful { return server{state: 0, stateMutex: sync.Mutex{}, beingUpdated: false}}func (s *stateful) SetState(st int) { s.stateMutex.Lock() s.beingUpdated = true s.state = st s.beingUpdated = false s.stateMutex.Unlock()}func (s *stateful) GetState() bool { if s.beingUpdated { // wait for s.stateMutex to be unlocked } return s.state}
1 回答

FFIVE
TA貢獻(xiàn)1797條經(jīng)驗(yàn) 獲得超6個(gè)贊
您可能誤讀了同步。RWMutex docs:
...鎖可以由任意數(shù)量的讀取器或單個(gè)寫(xiě)入器持有。
所以你的代碼簡(jiǎn)化如下:
type stateful struct {
l sync.RWMutex // style: place lock above ...
state int // ... the field it protects
}
func (s *stateful) SetState(st int) {
s.l.Lock()
defer s.l.Unlock()
s.state = st
}
func (s *stateful) GetState() int {
s.l.RLock()
defer s.l.RUnlock()
return s.state
}
- 1 回答
- 0 關(guān)注
- 113 瀏覽
添加回答
舉報(bào)
0/150
提交
取消