標準/拡張機能 | C/C++ | 依存項目 |
---|---|---|
POSIX.4a |
両方 | 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 を戻します。
Single UNIX Specification、バージョン 3 の特殊な動作: 正常に実行されなかった場合、pthread_create() はエラーを示すエラー番号を戻します。
⁄* 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'