マルチスレッドのプログラミング

スレッドの取り消し

スレッド取り消しによって、スレッドはそのプロセス中のほかのスレッドの実行終了を要求することができます。関連のある一群のスレッドの以降の操作がすべて有害または不必要な状況では、取り消しは 1 つの有効な方法です。

スレッドの取り消しの例としては、非同期的に生成される取り消し条件、たとえば実行中のアプリケーションを閉じるまたは終了するというユーザーの要求などがあります。また、複数のスレッドが関わっているタスクの完了などもあります。スレッドの 1 つが最終的にタスクを完了させたのに、ほかのスレッドが動作し続ける場合があります。実行中のスレッドはその時点で何の役にも立っていないため、これらのスレッドは取り消されるべきです。

取り消しポイント

スレッドの取り消しは、取り消しが安全な場合にだけ行なってください。pthread 規格では、下記のような取り消しポイントが規定されています。

デフォルトでは、取り消しが有効 (使用可能) です。場合によっては、アプリケーションで取り消しを無効 (使用不可) にすることがあるかもしれません。取り消しを無効にすると、再度取り消し要求を有効にするまでの間、すべての取り消し要求が保留されます。

取り消しを無効にする方法については、pthread_setcancelstate の構文」を参照してください。

取り消しポイントの配置

取り消しには危険が伴います。そのほとんどは、不変式の復元と共有リソースの解放処理に関係します。不注意に取り消されたスレッドは mutex をロック状態のままにすることがあり、その場合はデッドロックを引き起こします。あるいは、どこか特定できないメモリー領域が割り当てられたままになり、メモリーを解放できなくなります。

標準 C ライブラリでは、取り消しをプログラムにより許可したり禁止したりする取り消しインタフェースを規定しています。どの点で取り消しが可能かを示す一群のポイント (取り消しポイント) も定義されています。このライブラリを使用することにより、取り消しハンドラの有効範囲を定義して、意図した時点で、意図した場所に確実に作用するように設定できます。取り消しハンドラは、リソースと状態を起点と同じ条件に戻すクリーンアップサービスを提供します。

取り消しポイントの配置と取り消しハンドラの効果は、アプリケーションに対する理解に基づくものでなければなりません。mutex は明らかに取り消しポイントではないので、ロックしている時間は必要最小限に留めるべきです。

非同期取り消しの領域は、宙に浮いたリソースや未解決の状態を生じさせるような外部に依存しないシーケンスに限定してください。入れ子の代替取り消し状態から復帰するときは、取り消し状態を復元するように注意してください。このインタフェースは、復元を容易に行えるように次の機能を提供しています。 pthread_setcancelstate(3C) は、参照される変数の中に現在の取り消し状態を保存します。pthread_setcanceltype(3C) は、同様に、現在の取り消しタイプを保存します。

取り消しが起こりうる状況は、次の 3 とおりです。

デフォルトでは、取り消しが起こりうるのは POSIX 規格で定義されているような、明確に定義されたポイントに限られます。

いずれの場合も、リソースと状態が起点と矛盾しない状態に復元されるように注意してください。