7.5.4 Semaphore オブジェクト

これはコンピュータ科学の歴史の中で最も古い同期プリミティブの1つであり、 オランダのコンピュータ科学者 Edsger W. Dijkstra によって発明されました (彼はacquire()release()の代わりに P()V()を使いました)。

セマフォはacquire()でデクリメントされrelease()で インクリメントされる内部カウンタを管理します。 カウンタが0より小さくなることは決してありません。 カウンタが0であることをacquire()メソッドが見いだしたとき、 他のスレッドがrelease()を呼び出すまでブロックされます。

class Semaphore( [value])
オプション引数は内部カウンタの初期値を与えます; デフォルトは1です。

acquire( [blocking])
セマフォを獲得します。

引数なしで呼出したとき: 内部カウンタが0より大きいならば、 1だけデクリメントし直ちに戻ります。 内部カウンタが0ならば、他のスレッドがrelease()を呼出し カウンタを0より大きくするまでブロックされます。 複数のacquire()呼出しがブロックされる場合、 release()がそれらのうちのただ1つを起こすよう、 適切な内部ロックを行ないます。 その実装はランダムに1つを選び出すかもしれません。 そのためブロックされたスレッドが起こされる順序に依存してはなりません。 このケースの返り値はありません。

blockingをTrueで呼出したとき: 引数なしで呼出した場合と同じことを 行ない、Trueを返します。

blockingをFalseで呼出したとき: ブロックされません。 引数なし呼出しにおいてブロックされるような状況ならば、直ちにFalseを返します。 そうでないなら引数なし呼出しと同じことを行ない、Trueを返します。

release( )
セマフォを解放し、内部カウンタを1インクリメントします。 カウンタが0で、他のスレッドが0より大きくなるのを待っているのなら、 そのスレッドは起きます。



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