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

計数型セマフォーの概要

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

これ以上リソースが存在しなくなると、セマフォーカウントは 0 になります。この場合、スレッドがカウントを 1 減らそうとすると、カウントが 0 より大きくなるまでブロックされます。

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

操作 

参照先 

セマフォーの初期化 

sem_init の構文」

セマフォーの加算 

sem_post の構文」

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

sem_wait の構文」

セマフォーの減算 

sem_trywait の構文」

セマフォーの削除 

sem_destroy の構文」

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

スケジューリングポリシーは、ブロックされたスレッドがどのように呼び起こされるかを決定します。デフォルトスケジューリングポリシー SCHED_OTHER は、スレッドが呼び起こされる順序を指定していません。SCHED_FIFO および SCHED_RR リアルタイムスケジューリングポリシーの下では、スレッドは優先順位に従って呼び起こされます。

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