# OS_SleepThreadDirect

## 構文

      #include <nitro/os.h>

      void OS_SleepThreadDirect( OSThread* thread, OSThreadQueue*  queue );

## 引数

thread | 停止させるスレッドへのポインタ
queue | 指定したスレッドを登録するスレッドキューへのポインタです。 NULL ならスレッドキューへの登録を行ないません。

## 返り値

なし。

## 説明

指定されたスレッドを一時停止し、queue で指定したスレッドキューへ登録します。

queueを使用して`OS_WakeupThread()` が呼び出されるか、 またはthreadを使用して`OS_WakeupThreadDirect()` が呼び出されると、 スレッドは一時停止状態から実行可能状態に遷移します。

thread が実行可能状態でない場合、何も行わずに戻ります。これは、他のスレッドキューに登録されている一時停止状態のスレッドが、別のスレッドキューに登録されることでキューリストが崩れることを防ぐためです。

この関数は特定のシグナルを使用せず外部から直接スレッド状態を変更しますので、 待ち行列や mutex を伴うタスクの処理と併せて使用する場合には、 予期せぬデッドロックを避けるために細心の注意が必要です。この関数は特殊な用途のために用意されている API なので、実装内容が不明な関数を呼び出しているスレッドには使用しないで下さい。

> `(例)
> /* 先に実行される, 優先度の低いスレッド */
> thread_1_proc()
> {
> critical_task();
> }
> /* 後に実行される, 優先度の高いスレッド */
> thread_2_proc()
> {
> OS_SleepThreadDirect(thread_1, NULL);
> critical_task();
> OS_WakeupThreadDirect(thread_1);
> }
> /* 共通して実行されるタスク */
> critical_task()
> {
> ここで行うとデッドロックを発生しうる処理
> - 排他制御にかかわるもの (LockMutexなど)
> - 待ち行列などによりスレッド実行の依存性が生じるもの (FS関数など)
> }
> `

## 参照

`OS_InitThread OS_CreateThread, OS_WakeupThread, OS_WakeupThreadDirect OS_SleepThread`

## 履歴

2009/11/19 thread が実行可能状態でない場合に何もしないことを追記
2007/12/03 注意文追加
2006/08/29 使用方法に関する注意事項を追記
2006/08/16 初版