はじめに
この連載ではUNIX系OSなどで使われるスレッド「pthread」についてサンプルを交えて説明していきます。pthreadはPOSIXが仕様化したスレッドモデルです。サンプルはCと一部C++、調査環境はFedora 8(2.6.23.1-49.fc8)、32bit、glibc-4.1-2、gcc-4.1.2-33およびFedora Core 6(2.6.18-1.2798.fc6)、32bit、glibc-2.5-3、gcc-4.1.1-30を使用しています。
前回の記事
- 第1回:pthreadについて(概要・生成)
- 第2回:pthreadについて(同期)
4. 条件変数(1/3)
同期処理を行う際、ある共有情報が条件を満たしたらスレッドが動いて欲しい、という時があります。それまではサスペンドしてて欲しいですが、条件が満たされた時に他のスレッドから処理を始めるよう合図する仕組みが必要です。
条件変数は上記のような仕組みを提供します。
混乱しないように述べますが、mutexは共有情報への同時多重アクセスを回避するための機能で、条件変数はもっと単純で、スレッドの停止・再開を指示する信号のような機能です。
また、条件変数は必ずmutexとペアで使用されます。これは条件変数そのものがスレッドにとってクリティカルな情報であるからです。
4.1 関数リファレンス
主な条件変数にかかわる関数は以下の通りで、詳細は適時man
やココなどで参照してください。
- int pthread_cond_init( pthread_cond_t * cond, pthread_condattr_t * cond_attr );
- int pthread_cond_destroy ( pthread_cond_t * cond );
- int pthread_cond_wait( pthread_cond_t * cond, pthread_mutex_t * mutex);
- int pthread_cond_timedwait( pthread_cond_t * cond, pthread_mutex_t *mutex, const struct timespec * abstime );
- int pthread_cond_signal( pthread_cond_t * cond );
- int pthread_cond_timedwait( pthread_cond_t * cond, pthread_mutex_t * mutex, const struct timespec * abstime );
- int pthread_cond_signal( pthread_cond_t * cond );
- int pthread_cond_broadcast( pthread_cond_t * cond );
4.1.1 各関数について
- pthread_cond_init
- pthread_cond_t
pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
- pthraed_cond_destroy
- pthread_cond_wait
- pthread_cond_timedwait
- pthread_cond_signal
- pthread_cond_broadcast