# OS_SetThreadDestructor

## 構文

      #include <nitro/os.h>

      void OS_SetThreadDestructor( OSThread* thread, OSThreadDestructor dtor );

## 引数

thread | デストラクタを設定するスレッド構造体へのポインタ
dtor | デストラクタ関数

## 返り値

なし。

## 説明

スレッドが終了するときに呼ばれる関数(デストラクタ関数)を設定します。

スレッドは thread で指定します。dtor は `OSThreadDestructor` 型の関数へのポインタで、`OSThreadDestructor` 型は、

`typedef void (*OSThreadDestructor)( void* );`

と定義されています。

デストラクタ関数は以下の状況でスレッドが終了するときに呼ばれます。

> ・スレッドのタスクを最後まで実行し終わった
> ・`OS_ExitThread()` で終了した
> ・`OS_KillThread*()` で他のスレッドから終了させられた
> ・`OS_KillThread*()` で自らのスレッドを終了させた

以下の場合にはデストラクタ関数が呼ばれることはありません。

> ・`OS_DestroyThread()` で他のスレッドから終了させられた
> ・`OS_DestroyThread()` で自らのスレッドを終了させた

デストラクタ関数が実行されるときは、その終了するスレッドのコンテキストに切り替わって実行されます。そしてスタックポインタが変更されます(後述)。デストラクタは内部のスレッド情報を変更する前に割り込み禁止状態で呼ばれます。

デストラクタ関数実行時のスタックは、デフォルトでは(チェック用のコードを除いた)最上位に変更されます。 `OS_SetThreadDestructorStack()` を使って、指定のスタックに変更することも可能です。

スレッドリストに不整合が生じる可能性がありますので、デストラクタ関数内では、割り込み禁止を解除したり、スレッドのスケジューリングを発生させる関数を呼ばないようにしてください。

## 参照

`OS_InitThread,` `OS_ExitThread, OS_DestroyThread, OS_KillThread*`
`OS_GetThreadDestructor, OS_SetThreadDestructorStack
`

## 履歴

2007/08/20 デストラクタ関数内での注意事項を追記
2005/08/09 `OS_SetThreadDestructorStack` について追記
2005/07/07 デストラクタ関数が呼ばれる状況について追記
2005/06/30 初版