Silphireの日記: pthread日記(51) - Condition Variable overview
日記 by
Silphire
Condition Variable(以下、条件変数と表記)は、複数のスレッドによって共有されているオブジェクトがある条件を満たすまで、スレッドをブロックする為のシンプルな仕組みです。
条件変数VがスレッドAとスレッドBによって共有されているとします。スレッドBがある状態になるまでスレッドAがブロックをする為には、まず条件変数Vを使ってスレッドAがブロックします。スレッドBがある状態になった時、スレッドBは条件変数Vを操作して、スレッドAに条件が満たされた事を伝えます。条件変数Vが操作されると、スレッドAはアンブロックして、再び実行を再開します。
上に示したような場面では、スレッドAがブロックする前にスレッドBが条件を満たして条件変数Vを操作してしまい、結果として競合状態に陥ってしまうという可能性があります。それを防ぐ為に、条件変数はMutexで保護されている必要があります。実際にpthread_cond系の関数では、条件変数を操作する時に必ずMutexを伴います。上の例を用いると、スレッドAはブロックに入る前にMutexを確保してロックし、それを伴って条件変数Vをロックします。条件変数VのロックによってスレッドAがブロックするのと同時に、スレッドBが条件変数Vを使えるようにMutexはアンロックされます。スレッドBがある状態になり、スレッドAがアンブロックすると、Mutexは再びロックされます。
pthread日記(51) - Condition Variable overview More ログイン