マルチスレッドのプログラミング

計数型セマフォ

セマフォは、負の値をとらない整数のカウンタと考えることができます。通常は、リソースに対するアクセスの調整をはかる目的で、次のように使用されます。最初に、使用可能なリソースの数をセマフォに初期設定します。その後、スレッドはリソースが追加されるときにセマフォの値を原子的操作によって 1 増やし、リソースが削除されるときに原子的操作によって 1 減らします。

セマフォの値が 0 になった場合は、リソースがないことを意味します。この場合、セマフォの値を 1 減らそうとすると、スレッドはセマフォの値が 0 より大きくなるまでブロックされます。

表 4-7 セマフォに関するルーチン

操作 

参照先 

セマフォの初期化 

「sema_init(3THR)」

セマフォの加算 

「sema_post(3THR)」

セマフォの値によるブロック 

「sema_wait(3THR)」

セマフォの減算 

「sema_trywait(3THR)」

セマフォの削除 

「sema_destroy(3THR)」

セマフォは、その獲得と解放を同じスレッドで行う必要がないため、シグナルハンドラで行われているような非同期のイベント通知を実現できます。また、セマフォ自身が状態を持っているため、条件変数を使用する場合と違って相互排他ロックを獲得しなくても非同期で使用できます。ただし、セマフォは相互排他ロックほど効率的ではありません。

セマフォで複数のスレッドがブロックされているとき、それらのスレッドがどの順番でブロック解除されるかは、特に指定しなければ不定です。

セマフォは、使用する前に初期化されている必要がありますが、属性はありません。