CodeZine(コードジン)

特集ページ一覧

pthreadについて(キャンセル)

スレッドのキャンセル方法、およびその影響や注意点

  • ブックマーク
  • LINEで送る
  • このエントリーをはてなブックマークに追加
2008/02/07 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を使用しています。

前回の記事

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:当関数に達した時に取り消し要求があった場合、取り消し処理が行われる。それ以外では何もしない。無害な取り消しポイント。

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

著者プロフィール

  • 赤松 エイト(エイト)

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

バックナンバー

連載:pthreadについて

もっと読む

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