名称
pthread_resume_np(), pthread_continue(), pthread_suspend() ― スレッドの実行の再開、スレッドの実行の継続、スレッドの実行の一時停止
構文
#include <pthread.h>
int pthread_continue(
pthread_t thread
);
int pthread_resume_np(
pthread_t thread,
int flags
);
int pthread_suspend(
pthread_t thread
);
パラメータ
| thread | | 実行を一時停止または再開するスレッド。 |
| flags | | thread_resume_np() で使用するフラグ。
有効な値は、次のとおりです。 | PTHREAD_COUNT_RESUME_NP | | | | 対象スレッドの一時停止カウントを 1 つ減らします。
対象スレッドが一時停止されており、一時停止カウントが 1 より大きい場合、スレッドは実行を再開しません。 | | PTHREAD_FORCE_RESUME_NP | | | | 対象スレッドの一時停止カウントを 0 に設定します。
その一時停止カウントが 1 より大きいとしても、対象スレッドは実行を再開します。 |
|
説明
pthread_suspend() 関数は、 thread で指定された対象スレッドを一時的に停止させます。
対象スレッドは、すぐに (その瞬間に) 一時停止しない可能性があります。 pthread_suspend() 関数が正常終了して戻ると、 thread はもう実行を停止しています。 いったんスレッドが一時停止すると、それ以後の pthread_suspend() 関数呼び出しでは、スレッドごとの一時停止カウントが増加され、呼び出しは即座に戻ります。
thread に呼び出しスレッドを指定して pthread_suspend() を呼び出すこともできます。
この場合、呼び出しスレッドは pthread_suspend() 関数の実行中に一時停止し、別のスレッドが、 thread に対して pthread_resume_np() または pthread_continue() 関数を呼び出した後でなければ関数から戻りませんので、ご注意ください。
pthread_continue() 関数は、対象スレッド thread の実行を再開します。 pthread_suspend() を複数回呼び出して thread が一時停止している場合でも、 thread の実行を再開するのに必要なのは、1 回の pthread_continue() の呼び出しだけです。
一時停止していない対象スレッドに pthread_continue() を呼び出しても、何の影響もなく、エラーも返されません。 pthread_continue() の呼び出しは、 flags パラメータに PTHREAD_FORCE_RESUME_NP を指定して pthread_resume_np() を呼び出すのと同じです。
pthread_resume_np() 関数は、 thread で指定された対象スレッドの実行を再開します。 flags 引き数が PTHREAD_COUNT_RESUME_NP の場合、対象スレッドの一時停止カウントが 1 つ減ります。 flags 引き数が PTHREAD_FORCE_RESUME_NP の場合、対象スレッドの一時停止カウントは 0 に設定されます。
対象スレッドの一時停止カウントが 0 に達すると、対象スレッドは実行を継続できます。
一時停止していない対象スレッドに pthread_resume_np() を呼び出しても、何の影響もなく、エラーも返されません。
戻り値
正常終了すると pthread_continue()、 pthread_suspend()、 pthread_resume_np() は 0 を返します。
それ以外の場合、エラーの内容を表すエラー番号を返します (errno 変数は使用しません)。
エラー
以下の現象が発生した場合、 pthread_suspend() 関数は、該当するエラー番号を返します。
| [ESRCH] | | 対象スレッド thread が現在のプロセス中に存在しない場合。 |
| [EDEADLK] | | 対象スレッド thread が、プロセスで最後に実行するスレッドの場合。 操作すると、プロセスがデッドロックする結果になります。 |
以下の現象が発生した場合、 pthread_continue() と pthread_resume_np() 関数は、該当するエラー番号を返します。
| [ESRCH] | | 対象スレッド thread が現在のプロセス中に存在しない場合。 |
| [EINVAL] | | flags に指定された値が無効の場合。 |
アプリケーション使用法
この機能により、マルチスレッドプロセスのすべての活動を一時的に停止し、単一スレッド制御にすることができます。
プロセスが単一スレッドであるとき、アドレス空間に変更はなく、プロセスに対する一貫した概観を得られます。
一例に、ガベージコレクションのための使用があります。 ガベージコレクタはプロセス内で非同期に実行し、実行の間、プロセスには変更がないと想定します。
スレッドを一時停止すると、アプリケーションに悪い影響が及ぶ可能性があります。 mutex または読み書きロックなどの重大なリソースを持っているスレッドを一時停止すると、スレッドが再開するまでアプリケーションが止まる可能性があり、デッドロックさえ発生するかもしれません。
スレッドが一時停止している間、同じリソースを取得しようとしている可能性のある他のスレッドを、停止スレッドが再開するまでブロックしなければなりません。
アプリケーションの動作によっては、この結果デッドロックが発生することさえあります。
アプリケーションプログラマの方には、a) 非同期シグナルに対して害のない関数を呼び出すスレッドのみを一時停止する、または
b) 一時停止したスレッドが取得した可能性のあるリソースを、一時停止させているスレッドが取得しようとしないことを確実にする、のどちらかの方法をとるようお奨めします。
注意: これには、ライブラリが取得する可能性のあるリソースも含まれます。
pthread_suspend()、 pthread_continue()、 pthread_resume_np() 関数は、スレッド同期の目的で確実に使用することはできません。
その代わりに、mutex、セマフォ、読み書きロック、条件変数などの基本的な同期処理関数を使用する必要があります。
著者
pthread_suspend() と pthread_continue() は、X/Open が開発しました。
pthread_resume_np() は、HP が開発しました。
標準準拠
pthread_continue(): X/Open.
pthread_resume_np(): なし
pthread_suspend(): X/Open.