Shoeisha Technology Media

CodeZine(コードジン)

特集ページ一覧

pthreadについて(条件変数・モデル)

pthreadにおける条件変数の扱い方、気をつける点、簡単なアプリケーション

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2007/12/26 14:00

pthreadはPOSIX仕様に基づくOSにおける非同期処理の仕組みです。他の非同期処理と比較すると新しい仕組みですが、その奥は深くさまざまな機能を持っています。本稿では条件変数の概要、気をつける点、同期と条件変数を使用したアプリケーションを解説します。

目次

はじめに

 この連載では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を使用しています。

前回の記事

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
  • 条件変数condをcond_attrで指定された条件属性で初期化します。条件属性がNULLの時はデフォルト値で初期化します。
  • pthread_cond_t
  • 条件変数です。初期化される事で初めて条件処理として使用できるため、必ず初期化が必要です。また、条件変数は下記のように静的に初期化することも可能です。
    pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
    
    私は条件属性を常にNULLにしています。Linux環境では条件属性は未対応だそうです。
  • pthraed_cond_destroy
  • 条件変数を破壊します。
  • pthread_cond_wait
  • サスペンドします。その際、引数のmutex変数をアンロックにします。サスペンドを解除するには条件変数に対し他スレッドからpthread_cond_signalおよびpthread_cond_broadcastを実行されなくてはいけません。解除される時、引数のmutex変数は再度ロックされます。
  • pthread_cond_timedwait
  • 基本的な動きはpthread_cond_waitと同じで、タイムアウト設定が可能で、タイムアウトすると戻り値にETIMEDOUTが帰ります。
  • pthread_cond_signal
  • 条件変数でサスペンドしているスレッドのどれか1つを起こします。スケジューリングされていない場合はどれが起きるかは規定されていません。
  • pthread_cond_broadcast
  • 条件変数でサスペンドしている全てのスレッドを起こします。

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加

著者プロフィール

  • 赤松 エイト(エイト)

    (株)DTSに勤てます。 WebアプリやJavaやLL等の上位アプリ環境を密かに憧れつつも、ず~っとLinuxとかHP-UXばかり、ここ数年はカーネル以上アプリ未満のあたりを行ったり来たりしています。 mixiもやってまして、こちらは子育てとか日々の日記メインです。

バックナンバー

連載:pthreadについて

もっと読む

All contents copyright © 2005-2020 Shoeisha Co., Ltd. All rights reserved. ver.1.5