C言語 - 標準ライブラリ - pthread.h
- 1. 概要
- 2. pthread_create スレッド作成
- 3. pthread_join スレッド待機
- 4. pthread_timedjoin_np スレッド待機(タイムアウト)
1. 概要
「pthread.h」には、スレッド関連の関数が定義されています。
本ページは、下記のサイトを参考にさせていただきました。
「man pthread_timedjoin_np (3): 終了したスレッドの join を...」
2. pthread_create スレッド作成
「pthread_create」は、スレッドを新規に作成します。
#include <pthread.h>
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void *(*start_routine)(void *), void *arg);
プロセス内に 「attr」によって指定された属性をもつ新しいスレッドを作成します。
「attr」が「NULL」である場合には、デフォルトの属性が使用されます。
「attr」によって指定された属性が後から更新された場合には、スレッドの属性は変化しません。
問題なく完了すると、「pthread_create()」は「thread」によって指定された場所に作成されたスレッドの「ID」を格納します。
スレッドは、「arg」を引数として「start_routine」を実行することで作成されます。
「start_routine」が戻った場合には、「start_routine」の戻り値を終了ステータスとして使用し、暗黙のうちに「pthread_exit()」を呼び出したような効果があります。
「main()」を最初に実行したスレッドは、これとは異なることに注意。
そのスレッドが「main()」から戻った時には、「main()」の戻り値を終了ステータスとして使用し、暗黙のうちに「exit()」を呼び出したような効果があります。
新しいスレッドのシグナルの状態は、以下のように初期化されます。
・シグナルマスクは作成しているスレッドから継承されます。
・新しいスレッド用に保留しているシグナルのセットは空です。
戻り値。1
問題がない場合は、「pthread_create()」関数は「0」を返します。
問題がある場合は、そのエラーを示すためにエラー番号が返されます。
スレッドの作成に失敗した場合、戻り値として、下記の値が返ってきます。
「EAGAIN」
別のスレッドを作成するために必要なリソースがシステムに不足しています。
または、1 つのプロセス内の総スレッド数についてのシステムの制限「PTHREAD_THREADS_MAX」を超過しました。
「EINVAL」
「attr」によって指定された値が、有効ではありません。
3. pthread_join スレッド待機
#include <pthread.h>
int pthread_join(pthread_t thread, void **value_ptr);
対象「thread」がまだ終了していない場合には、その対象「thread」が終了するまで、呼び出しているスレッドの実行を保留します。
「NULL」ではない「value_ptr」引数を持つ「pthread_join()」の呼び出しから成功で戻った時には、終了したスレッドによって「pthread_exit()」に渡された値が、「value_ptr」によって参照される位置に格納されます。
「pthread_join()」が成功で戻った時には、その対象スレッドは既に終了しています。
同じ対象スレッドを指定した複数で同時の「pthread_join()」の呼び出しによる結果は、未定義です。
「pthread_join()」を呼び出しているスレッドが取り消された場合には、その対象スレッドはデタッチされません。
既に終了したが持ち受けされずに残っているスレッドは、「_POSIX_THREAD_THREADS_MAX」に対してカウントされます。
問題がない場合は、「pthread_join()」関数は 0 を返します。
問題がある場合は、そのエラーを示すためにエラー番号が返されます。
エラー番号は、以下の通り。
・EINVAL 「thread」によって指定された値が、待機されることが可能なスレッドを参照していないことを検出
・ESRCH 与えられたスレッド「ID」,「thread」によって指定されたものと一致するスレッドを見つけることができない
・EDEADLK デッドロックを検出、または、「thread」の値が呼び出しているスレッドを指定している
4. pthread_timedjoin_np スレッド待機(タイムアウト)
#include <pthread.h>
int pthread_timedjoin_np(pthread_t thread, void **retval, const struct timespec *abstime);
これは、「FreeBSD」の「jman」には、採用されていませんでした。
「man」では、参照できます。
タイムアウト付きの「join」を行う。
「thread」がまだ終了していない場合、「abstime」で指定された最大時間 まで停止する。
「thread」が終了する前にタイムアウト時間が経過した場合は、エラーを返す。
成功すると、これらの関数は 0 を返す。
エラーの場合、以下のエラー番号を返す。
・EBUSY 呼び出しを行った時点では「thread」はまだ終了していない
・ETIMEDOUT 「thread」が終了する前に呼び出しがタイムアウトとなった
「pthread_timedjoin_np()」がエラー「EINTR」を返すことはない。
|
|