2017-10-17 18 views
1

に、私たちは "ロック" の定義を見ることができます:implementions()は次のよう<a href="https://golang.org/src/sync/rwmutex.go" rel="nofollow noreferrer">src/sync/rwmutex.go</a>ファイルにgolang

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 

この文を疑問に思います手段。そしてそれが言うように、どのように読者に発表?それを理解する方法?

+1

rw.readerCount <= rwmutexMaxReadersなので、rw.readerCount-rwmutexMaxReadersは、readerCountを0またはnegativ(信号)にします。 rwmutxMaxReadersを追加すると、rはreaderWaitの実数と等しくなります。 – Volker

答えて

0

あなたは魔法が好きですか?これはそうです; o)いいえ。私は冗談です。

我々は

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

rw.readerCountからこのアトミックsubstract rwmutexMaxReadersで開始することができます。新しい値はrw.readerCountに格納され、関数によっても返されます。 rwmutexMaxReadersを追加するときは、AddInt32の前に古い値rw.readerCountを計算するだけです。

0

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. 新しいリーダーが読み取りロックを取得したい場合は、rw.readerCount(1行目)に1を加えて、それが否定的であるかどうかを確認します。もしそれが否定的であれば、作家はそのように設定しており、作家が終了してから続けるのを待つべきです。

rw.readerCountの符号の周りで信号が発生します。

関連する問題

 関連する問題