SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

pthreadについて

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

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


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

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
  • 条件変数でサスペンドしている全てのスレッドを起こします。

会員登録無料すると、続きをお読みいただけます

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

次のページ
4. 条件変数(2/3)

この記事は参考になりましたか?

  • このエントリーをはてなブックマークに追加
pthreadについて連載記事一覧

もっと読む

この記事の著者

赤松 エイト(エイト)

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

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/1894 2008/08/20 15:59

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング