#include <thread.h> int thr_create(void *stack_base, size_t stack_size, void *(*start_routine) (void *), void *arg, long flags, thread_t *new_thread); size_t thr_min_stack(void);
新しいスレッドは保留中のシグナルは継承しませんが、優先順位とシグナルマスクを継承します。
stack_base 。新しいスレッドが使用するスタックのアドレスを指定します。NULL を指定すると、新しいスレッドに stack_size バイト以上のサイズをもつスタックが割り当てられます。()
stack_size。新しいスレッドが使用するスタックのバイト数を指定します。stack_size が 0 の場合、デフォルトのサイズが使用されます。通常は 0 を指定してください。stack_size が 0 以外の場合は、thr_min_stack() の戻り値よりも大きい値を指定してください。
通常、スレッド用にスタック空間を割り当てる必要はありません。システムが、各スレッドのスタック用に 1M バイトの仮想メモリーをスワップ空間の予約なしで割り当てます。システムは、mmap(2) の -MAP_NORESERVE オプションを使って割り当てを行います。
start_routine — 新しいスレッドが実行を開始するために使用する関数を指定します。start_routine() で指定した関数が終了すると、スレッドはその関数の戻り値を終了状態に設定して終了します。「thr_exit の構文」を参照してください。
arg — void で記述される任意の変数で、通常は 4 バイト値です。それよりも大きな値を渡す場合は、引数が変数を指す方法で間接的に渡す必要があります。
引数は 1 つしか指定できません。複数の引数をとらせるためには、それらを構造体に入れるなどして、1 つのものとしてコーディングします。
flags — 生成されるスレッドの属性を指定します。通常は 0 を指定してください。
flags の値は、以下に示す引数のビット単位の論理和となります。
THR_SUSPENDED — 新しいスレッドを停止させます。thr_continue でスレッドを再開するまで start_routine() は実行されません。 THR_SUSPENDED は、スレッドを実行する前に優先順位の変更などを行いたいときに使用します。
THR_DETACHED — 新しいスレッドを切り離します。その結果、このスレッドのスレッド識別子やその他のリソースが、スレッド終了後ただちに再利用できるようになります。THR_DETACHED は、スレッドの終了を待つ必要がないときに設定してください。
明示的な同期が割り当てられていないとき、停止していない切り離されたスレッドは失敗することがあります。失敗すると、そのスレッドの生成元が thr_create() から復帰する前に、そのスレッド ID が別の新しいスレッドに割り当てられます。
THR_BOUND — 新しいスレッドを永続的に LWP に結合します。新しいスレッドは結合スレッドになります。Solaris 9 リリースから、結合スレッドと非結合スレッドが区別されなくなりました。すべてのスレッドが結合スレッドとして扱われます。
THR_DAEMON — 新しいスレッドをデーモンにします。デーモンスレッドは常に切り離されます。THR_DAEMONを指定すると、暗黙的に THR_DETACHED が適用されます。デーモンでないスレッドがすべて終了すると、プロセスは終了します。デーモンスレッドは、プロセスの終了状態に影響を与えず、また終了するスレッド数にも含まれません。
プロセスを終了するには、exit() を呼び出すか、プロセス内のスレッドのうち THR_DAEMON フラグを指定せずに生成されたすべてのスレッドから thr_exit(3C) を呼び出します。アプリケーションやそのプロセスによって呼び出されるライブラリでは、終了判断の際に無視される (考慮されない) スレッドを生成できます。THR_DAEMON フラグは、プロセスの終了条件に関係しないスレッドを生成するときに指定します。
new_thread — new_thread が NULL 以外の場合には、thr_create() が正常終了したときに新しいスレッドの ID が格納された場所を指しています。この引数が指す記憶領域は、呼び出し側の責任で確保しなければなりません。このスレッド識別子は、呼び出し側のプロセス内でだけ有効です。
スレッド識別子が特に必要でなければ、new_thread に NULL を指定してください。