これはコンピュータ科学の歴史の中で最も古い同期プリミティブの1つであり、 オランダのコンピュータ科学者 Edsger W. Dijkstra によって発明されました (彼はacquire()とrelease()の代わりに P()とV()を使いました)。
セマフォはacquire()でデクリメントされrelease()で インクリメントされる内部カウンタを管理します。 カウンタが0より小さくなることは決してありません。 カウンタが0であることをacquire()メソッドが見いだしたとき、 他のスレッドがrelease()を呼び出すまでブロックされます。
[value]) |
1
です。
[blocking]) |
引数なしで呼出したとき: 内部カウンタが0より大きいならば、 1だけデクリメントし直ちに戻ります。 内部カウンタが0ならば、他のスレッドがrelease()を呼出し カウンタを0より大きくするまでブロックされます。 複数のacquire()呼出しがブロックされる場合、 release()がそれらのうちのただ1つを起こすよう、 適切な内部ロックを行ないます。 その実装はランダムに1つを選び出すかもしれません。 そのためブロックされたスレッドが起こされる順序に依存してはなりません。 このケースの返り値はありません。
blockingをTrueで呼出したとき: 引数なしで呼出した場合と同じことを 行ない、Trueを返します。
blockingをFalseで呼出したとき: ブロックされません。 引数なし呼出しにおいてブロックされるような状況ならば、直ちにFalseを返します。 そうでないなら引数なし呼出しと同じことを行ない、Trueを返します。
) |