はじめに
この連載では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について(同期)
- 第3回:pthreadについて(条件変数・モデル)
- 第4回:pthreadについて(スレッド固有データ)
- 第5回:pthreadについて(スタックサイズ)
- 第6回:pthreadについて(スケジューリング)
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
:当関数に達した時に取り消し要求があった場合、取り消し処理が行われる。それ以外では何もしない。無害な取り消しポイント。