7.5.2 RLock オブジェクト

再入可能ロック (reentrant lock) とは、同じスレッドが複数回獲得できるような 同期プリミティブです。再入可能ロックの内部では、プリミティブロックの使う ロック/アンロック状態に加え、 ``所有スレッド (owning thread)'' と ``再帰レベル (recursion level)'' という概念を用いています。 ロック状態では何らかのスレッドがロックを所有しており、アンロック状態では いかなるスレッドもロックを所有していません。

スレッドがこのロックの状態をロックにするには、ロックのacquire() メソッドを呼び出します。このメソッドは、スレッドがロックを所有すると 処理を戻します。ロックの状態をアンロックにするにはrelease() メソッドを呼び出します。 acquire()/release() からなるペアの呼び出しはネスト できます; 最後に呼び出した release() (最も外側の呼び出しペア) だけが、ロックの状態をアンロックにリセットし、acquire() で ブロック中の別のスレッドの処理を進行させられます。

acquire( [blocking = 1])
ブロックあり、またはブロックなしでロックを獲得します。

引数なしで呼び出した場合: スレッドが既にロックを所有している場合、 再帰レベルをインクリメントして即座に処理を戻します。 それ以外の場合、他のスレッドがロックを所有していれば、 そのロックの状態がアンロックになるまでブロックします。その後、 ロックの状態がアンロックになる (いかなるスレッドもロックを所有しない状態 になる) と、ロックの所有権を獲得し、再帰レベルを 1 にセットして処理を 戻します。ロックの状態がアンロックになるのを待っているスレッドが複数 ある場合、その中の一つだけがロックの所有権を獲得できます。この場合、 戻り値はありません。

blocking 引数の値を真にした場合、引数なしで呼び出した場合と 同じ処理を行って真を返します。

blocking 引数の値を偽にした場合、ブロックしません。 引数なしで呼び出した場合にブロックするような状況であった場合には 直ちに偽を返します。それ以外の場合には、 引数なしで呼び出したときと同じ処理を行い真を返します。

release( )
再帰レベルをデクリメントしてロックを解放します。 デクリメント後に再帰レベルがゼロになった場合、ロックの状態を アンロック (いかなるスレッドにも所有されていない状態) にリセットし、 ロックの状態がアンロックになるのを待ってブロックしているスレッドが ある場合にはその中のただ一つだけが処理を進行できるようにします。 デクリメント後も再帰レベルがゼロでない場合、ロックの状態はロックの ままで、呼び出し手のスレッドに所有されたままになります。

呼び出し手のスレッドがロックを所有しているときにのみこのメソッドを 呼び出してください。ロックの状態がアンロックの時にこのメソッドを 呼び出してはなりません。

戻り値はありません。

ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。