pthread_create サブルーチン

目的

新規スレッドを作成して、その属性を初期化し、実行可能にします。

ライブラリー

スレッド・ライブラリー (libpthreads.a)

構文

#include <pthread.h>

int pthread_create (thread, attr, start_routine (void *), arg)
pthread_t *thread;
const pthread_attr_t *attr;
void *(*start_routine) (void *);
void *arg;

説明

pthread_create サブルーチンは、新規スレッドを作成し、 attr パラメーターによって指定されたスレッド属性オブジェクトを使用してその属性を初期化します。 新規スレッドは、作成スレッドのシグナル・マスクを継承しますが、新規スレッドの作成スレッドの保留シグナルはすべてクリアされます。

新規スレッドは実行可能になり、 arg パラメーターで指定されたパラメーターを使用して start_routine ルーチンの実行を開始します。 arg パラメーターは void ポインターです。任意の種類のデータを参照できます。 キャストは移植できない可能性があるため、このポインターをスカラー・データ・タイプ (例えば、int ) にキャストすることは推奨されません。

スレッドの作成後、スレッド属性オブジェクトを再利用して別のスレッドを作成したり、削除したりすることができます。

スレッドは、以下の場合に終了します。

  • その開始ルーチン (初期スレッドの main ルーチン) から戻されたスレッド。
  • スレッドが pthread_exit サブルーチンを呼び出した
  • スレッドは取り消されました
  • スレッドが、終了したシグナルを受信しました。
  • exec または exit サブルーチンのいずれかの呼び出しが原因で、プロセス全体が終了します。
    注: pthread.h ヘッダー・ファイルは、スレッド・ライブラリーを使用する各ソース・ファイルの最初の組み込みファイルでなければなりません。 それ以外の場合は、 -D_THREAD_SAFE コンパイル・フラグを使用するか、cc_r コンパイラーを使用する必要があります。 この場合、フラグは自動的に設定されます。

1 つのプロセスで複数のスレッドが作成されると、すべてのシグナルに対して FULL_CORE フラグが設定されます。 これは、コア・ファイルが作成されると、single_threaded アプリケーションよりもはるかに大きくなることを意味します。 これは、マルチスレッド・プロセスをデバッグするために必要です。

プロセスが pthread_create 関数を使用してマルチスレッド化されると、すべてのシグナルに対して FULL_CORE フラグが使用可能になります。 コア・ダンプを使用してプロセスを終了するアクションを実行するシグナルが受信されると、フル・ダンプ (通常は通常のダンプよりもはるかに大きい) が生成されます。 これは、マルチスレッド・プログラムを dbx コマンドでデバッグできるようにするために必要です。

以下の疑似コードの部分は、完全なコアを取得しないようにする方法の例です。 この場合、デバッグはできないことに注意してください。 ulimit コマンドを使用して、コアのサイズを制限する方が簡単な場合があります。

struct sigaction siga;
siga.sa_handler = SIG_DFL;
siga.sa_flags = SA_RESTART;
SIGINITSET(siga.as_mask);
sigaction(<SIGNAL_NUMBER>, &siga, NULL);

代替スタックは継承されません。

パラメーター

項目 説明
thread スレッド ID が保管される場所を指します。
attr スレッドの作成に使用するスレッド属性オブジェクトを指定します。 値が NULLの場合、デフォルトの属性値が使用されます。
開始ルーチン スレッドによって実行されるルーチンを指します。
ARG start_routine ルーチンに渡される単一の引数を指します。

戻り値

正常に実行された場合、 pthread_create 関数はゼロを戻します。 正常に実行されなかった場合、エラーを示すエラー番号を戻します。

エラー・コード

pthread_create 関数は、以下の場合に失敗します。

項目 説明
EAGAIN WLM が実行中の場合、クラス内のスレッド数の制限に達します。
EAGAIN 1 プロセス当たりのスレッド数の限界に達しました。
EINVAL attr によって指定された値が無効です。
EPERM 呼び出し元には、必要なスケジューリング・パラメーターまたはスケジューリング・ポリシーを設定するための適切な許可がありません。

pthread_create 関数は、エラー・コード EINTRを戻しません。