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

計数型セマフォ

セマフォの概念は、0 以上の整数カウントです。通常は、リソースに対するアクセスの調整をはかる目的で、次のように使用されます。最初に、使用可能なリソースの数をセマフォに初期設定します。スレッドは、リソースが追加されると不可分操作的にカウントを 1 加算し、リソースが削除されると不可分操作的に 1 減算します。

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

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

操作 

参照先 

セマフォの初期化 

sem_init(3RT)

セマフォの加算 

sem_post(3RT)

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

sem_wait(3RT)

セマフォの減算 

sem_trywait(3RT)

セマフォの削除 

sem_destroy(3RT)

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

デフォルトでは、複数のスレッドがセマフォを待機している場合、ブロックを解除する順序はあらかじめ定義されていません。

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