pthread_create() - スレッドの作成

標準

標準/拡張機能 C/C++ 依存項目

POSIX.4a
Single UNIX Specification、バージョン 3

両方

POSIX(ON)

形式

#define _OPEN_THREADS
#include <pthread.h>

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

SUSV3

#define _UNIX03_THREADS 
#include <pthread.h>
int pthread_create(pthread_t * __restrict__thread, 
                   const pthread_attr_t *attr, 
                   void *(*start_routine) (void *arg), 
                   void * __restrict__arg);

機能説明

pthread_attr_init() で作成されるスレッド属性オブジェクト attr で定義された属性をとる新規のスレッドを プロセス内に作成します。

attr が NULL の場合には、デフォルト属性が使用されます。スレッド属性とそのデフォルトの説明については、pthread_attr_init() - スレッド属性オブジェクトの初期化を参照してください。attr によって指定された属性が後で変更されても、スレッドの属性は 影響を受けません。

pthread_t は、スレッドを一意的に識別する場合に使用される データ型です。これは pthread_create() によって戻され、スレッド ID を必要とする アプリケーションで使用されます。

arg を唯一の引数として、スレッドは start_routine の 実行時に作成されます。pthread_create() が正常に完了すると、thread には 作成されたスレッドの ID が入ります。正常に実行されなかった場合、新規スレッドは作成されず、thread が参照したロケーションの内容は定義されません。

プロセスのスレッド限界のシステム・デフォルトは、MAXTHREADS によって BPXPRMxx parmlib メンバーの中に設定されます。

スレッドの最大数は、16 M より下の専用ストレージのサイズに依存します。pthread_create() は、新しいスレッドを作成する前に、このアドレス・スペースを検査します。実用的な限界は 200 ~ 400 スレッドです。

C++ の特殊な動作: C と C++ のリンケージ規約が非互換であるので、pthread_create() は、開始ルーチン関数ポインターとして C++ 関数ポインターを受けとることができません。C++ 関数ポインターを pthread_create() に渡そうとすると、コンパイラーは、これをエラーとしてフラグを付けます。C 関数または C++ 関数を外部「C」として宣言すると、これらの関数 を pthread_create() に渡すことができます。

開始済みスレッドは、スロー・キャッチ試行処理のスコープに関する境界を与えます。開始ルーチンまたは開始ルーチンで呼び出された関数で生じたスローは、開始ルーチンに至るまで (あるいはキャッチされるまで)、スタック・アンワインドアップの原因になります。スタック・アンワインドは、開始ルーチンを超えてスレッド作成者には戻りません。例外がキャッチされなかった場合には、terminate() が呼び出されます。

例外スタック (スロー・キャッチ試行) は、スレッドを基にしています。条件のスローまたはスレッドによる条件の再スローは、条件がキャッチされない 場合を除き、別のスレッドの例外処理に影響を与えません。

戻り値

正常に実行された場合、pthread_create() は 0 を戻します。

正常に実行されなかった場合、pthread_create() は -1 を戻して、errno を次のいずれかの 値に設定します。
エラー・コード
説明
EAGAIN
システムでは、別のスレッドを作成するために必要なリソースが不足しています。
EINVAL
thread によって指定された値はヌルです。
ELEMULTITHREADFORK
マルチスレッドのプロセスから fork() を呼び出すことによって作成された子プロセスから、pthread_create() が呼び出されました。この子プロセスは、マルチスレッドになることを制限されました。
ENOMEM
スレッドを作成するにはメモリーが不十分です。

Single UNIX Specification、バージョン 3 の特殊な動作: 正常に実行されなかった場合、pthread_create() はエラーを示すエラー番号を戻します。

CELEBP27
⁄* CELEBP27 *⁄
#define _OPEN_THREADS
#include <pthread.h>
#include <stdlib.h>
#include <stdio.h>
void *thread(void *arg) {
  char *ret;
  printf("thread() entered with argument '%s'¥n", arg);
  if ((ret = (char*) malloc(20)) == NULL) {
    perror("malloc() error");
    exit(2);
  }
  strcpy(ret, "This is a test");
  pthread_exit(ret);
}

main() {
  pthread_t thid;
  void *ret;

  if (pthread_create(&thid, NULL, thread, "thread 1") != 0) {
    perror("pthread_create() error");
    exit(1);
  }

  if (pthread_join(thid, &ret) != 0) {
    perror("pthread_create() error");
    exit(3);
  }

  printf("thread exited with '%s'¥n", ret);
}
出力:
thread() entered with argument 'thread 1'
thread exited with 'This is a test'

関連情報