セマフォ (semaphore) は、計算機科学史上最も古い同期プリミティブの一つで、 草創期のオランダ計算機科学者 Edsger W. Dijkstra によって発明されました (彼はacquire()とrelease()の代わりに P()とV()を使いました)。
セマフォはacquire() でデクリメントされrelease()で インクリメントされるような内部カウンタを管理します。 カウンタは決してゼロより小さくはなりません; acquire() は、 カウンタがゼロになっている場合、他のスレッドがrelease() を呼び出すまでブロックします。
[value]) |
1
です。
[blocking]) |
引数なしで呼び出した場合: acqure() 処理に入ったときに 内部カウンタがゼロより大きければ、カウンタを 1 デクリメントして 即座に処理を戻します。acqure() 処理に入ったときに 内部カウンタがゼロの場合、他のスレッドが release() を呼び出してカウンタをゼロより大きくするまでブロックします。 この処理は、適切なインターロック (interlock) を介して行い、 複数の acquire() 呼び出しがブロックされた場合、 release() が正確に一つだけを起こせるようにします。 この実装はランダムに一つ選択するだけでもよいので、ブロックされた スレッドがどの起こされる順番に依存してはなりません。 この場合、戻り値はありません。
blocking 引数の値を真にした場合、引数なしで呼び出した場合と 同じ処理を行って真を返します。
blocking 引数の値を偽にした場合、ブロックしません。 引数なしで呼び出した場合にブロックするような状況であった場合には 直ちに偽を返します。それ以外の場合には、 引数なしで呼び出したときと同じ処理を行い真を返します。
) |