スレッドのキャンセル方法、およびその影響や注意点
赤松 エイト [著] 2008/02/07 14:00

サンプルファイル 38.18 KB

pthreadはPOSIX仕様に基づくOSにおける非同期処理の仕組みです。他の非同期処理と比較すると新しい仕組みですが、その奥は深くさまざまな機能を持っています。本稿ではスレッドのキャンセル法とその影響、使ってはいけない理由等を解説します。

1 2 3 →

はじめに

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

前回の記事

10. キャンセル

 あらゆるアプリケーションにとって異常終了・メモリリーク・データ破壊等は絶対避けなくてはいけません。非同期処理を行うアプリケーションも同様です。

 特に非同期処理アプリで意識して避けなくてはいけない問題は、デッドロックです。一旦コレに陥ってしまうと、残された道は強制終了しかなくなります。スレッドも例外ではなく、デッドロックに対しては神経質な程に気をつけなくてはいけません。

 そしてキャンセル処理はその際たるもので、この章ではキャンセル処理の特徴と、デッドロックを誘発してしまう危険性について述べていきます。

10.1 リファレンス

 主にキャンセルの設定にかかわる関数は下記の通りです。より詳細についてはmanコマンド、もしくはココを参照してください。

  • int pthread_cancel( pthread_t thread );
    • pthread_cancel:引数のスレッドIDで指定されたスレッドに対して、取り消し要求を送ります。
    •  
  • int pthread_setcancelstate( int state, int * oldstate );
    • pthread_setcancelstate:スレッドの取り消し状態を変更します。
    • PTHREAD_CANCEL_ENABLE/PTHREAD_CANCEL_DISABLE のどちらかのみ設定可能。
      oldstate がNULLでないなら、変更前の取り消し状態を取得できます。
  • int pthread_setcanceltype( int type, int * oldtype );
    • pthread_setcanceltype:スレッドが取り消し要求を受けた時、すぐに受け入れるか遅延して受け入れるかを設定します。
  • void pthread_testcancel( void );
    • pthread_testcancel:当関数に達した時に取り消し要求があった場合、取り消し処理が行われる。それ以外では何もしない。無害な取り消しポイント。

1 2 3
→
INDEX
pthreadについて(キャンセル)
Page1
はじめに
10. キャンセル
10. キャンセル(遅延取り消し)
10. キャンセル(非同期取り消し)
プロフィール
赤松 エイト エイト

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


記事へのコメント・トラックバック機能は2011年6月に廃止させていただきました。記事に対する反響はTwitterやFacebook、ソーシャルブックマークサービスのコメントなどでぜひお寄せください。

スポンサーサイト