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

Solaris スレッドに固有の関数

スレッド実行の停止

thr_suspend(3T)

thr_suspend() は、target_thread で指定したスレッドの実行をただちに停止させます。thr_suspend() が正常終了した時点で、指定のスレッドは実行状態ではありません。

停止しているスレッドに対して再度 thr_suspend() を発行しても効果はありません。停止しているスレッドをシグナルで呼び起こすことはできません。スレッドが実行を再開するまでシグナルは保留状態のままです。

#include <thread.h>

int thr_suspend(thread_t tid);

次の例では、pthread で定義されている pthread_t tid と Solaris スレッドの thread_t tid が同じです。tid 値は、代入によっても型変換によっても使用できます。

thread_t tid; /* thr_create() からの tid */

/* pthread_create() で生成されたスレッドからの */
/* Solaris tid に相当する pthread */
pthread_t ptid;	

int ret;

ret = thr_suspend(tid);

/* 型変換で pthread ID 変数を使用する */
ret = thr_suspend((thread_t) ptid);	

戻り値

正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、thr_suspend() は失敗し、対応する値を戻します。


ESRCH

現在のプロセスに tid が存在しません。

停止しているスレッドの再開

thr_continue(3T)

thr_continue() は、停止しているスレッドの実行を再開します。再開したスレッドに対して再度 thr_continue() を発行しても効果はありません。

#include <thread.h>

int thr_continue(thread_t tid);

停止しているスレッドがシグナルで呼び起こされることはありません。送られたシグナルは、そのスレッドが thr_continue() で再開されるまで保留されます。

pthread で定義されている pthread_t tid と Solaris スレッドの thread_t tid が同じです。tid 値は、代入によっても型変換によっても使用できます。

thread_t tid; /* thr_create() からの tid */

/* pthread_create() で生成されたスレッドからの Solaris tid に */
/* 相当する pthread */
pthread_t ptid;	

int ret;

ret = thr_continue(tid);

/* 型変換で pthread ID 変数を使用する */
ret = thr_continue((thread_t) ptid)	

戻り値

正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下の条件が検出されると、thr_continue() は失敗し、対応する値を戻します。


ESRCH

現在のプロセスに tid が存在しません。

スレッドの並行度の設定

Solaris スレッドは、デフォルトでは、非結合スレッドの実行に使用するシステム実行資源 (LWP) を、有効なスレッドの実際の数に合わせて調整しようとします。Solaris スレッドパッケージは完璧な判定はできなくても、少なくともプロセスが実行を継続できるようにします。

どれだけの数の非結合スレッド (実行するコードまたはシステムコール) を同時に有効すべきか見当がつく場合は、thr_setconcurrency() で指定してください。使用されているスレッドの数を取得するには、thr_getconcurrency() を使用してください。

thr_setconcurrency(3T)

thr_setconcurrency() は、アプリケーションの中で必要とする並行度の目標値をシステムに指示します。システムは、十分な数のスレッドを有効にして、プロセスが実行を継続できるようにします。

#include <thread.h>


int new_level;
int ret;


ret = thr_setconcurrency(new_level);

プロセス内の非結合スレッドを同時に有効にする必要があるかどうかは、状況によって変化します。スレッドシステムのデフォルト設定では、システム資源を節約することを前提にして、プロセスに必要な数のスレッドを有効にします。また、並行度を小さくしすぎてプロセスがデッドロックに陥るといった事態が生じないように並行度も調整されます。

このようなデフォルトの設定では効果的な並行度が得られない場合、アプリケーション側は thr_setconcurrency()new_level の指定で、スレッドシステムに並行度の目標値を指示できます。

同時に有効になるスレッドの実際の数は、new_level より大きいことも小さいこともあります。

計算を目的とするスレッドが複数存在するアプリケーションでは、thr_setconcurrency() によって実行資源の並行度を調整しておかないと、実行可能なすべてのスレッドのスケジューリングが適切に行われないことがあります。

thr_create()THR_NEW_LWP フラグでも並行度に影響を与えることができます。これには、現在の並行度を 1 だけ大きくする効果があります。

戻り値

正常終了時は 0 です。それ以外の戻り値は、エラーが発生したことを示します。以下のいずれかの条件が検出されると、thr_setconcurrency() は失敗し、対応する値を戻します。


EAGAIN

指定の並行度ではシステム資源の制限を超えます。


EINVAL

new_level の値が負です。

スレッドの並行度の取得

thr_getconcurrency(3T)

thr_getconcurrency() は、thr_sgetconcurrency() で設定された並行度の現在値を取得します。同時に有効になっているスレッドの実際の数は、この値より大きいことも小さいこともあります。

#include <thread.h>

int thr_getconcurrency(void)

戻り値

thr_getconcurrency() は、常に並行度の現在の値を戻します。