| 日本−日本語 |
|
|
|
![]() |
HP-UX リファレンス: セクション 3 : ライブラリ (N~Z) > ppthread_once(3T)pthread ライブラリHP-UX 11i Version 2: September 2004 |
|
名称pthread_once() ― 初期化ルーチンの一度だけの呼び出し 構文#include <pthread.h> パラメータ
説明pthread_once() 関数は、アプリケーションで init_routine() が 1 回だけ呼び出されることを保証します。 この関数は、 init_routine() が pthread_once() を介して以前に呼び出されたか判断するために、 once_control オブジェクトを使用します。 最初に once_control と init_routine() を指定して pthread_once() を呼び出すと、引き数無しで init_routine() が呼び出されます。 それ以降、同じ once_control で pthread_once() を呼び出しても、 init_routine() は呼び出されません。 pthread_once() から戻った時には、 init_routine() が (前回の呼び出しの場合でも今回の呼び出しの場合でも) 呼び出されたことを保証されます。 マクロ PTHREAD_ONCE_INIT は、once control ブロックを静的に初期化するのに使用されます。 この初期化は、 pthread_once() 呼び出しの前に行われなければなりません。 pthread_once() は、取り消し地点ではありません。 しかし、呼び出し元にとっては init_routine() は取り消し地点であるかもしれません。 init_routine() を実行するスレッドが取り消された場合、 once_control 引き数には init_routine() が呼び出されなかったことを示すステータスが設定されます pthread_cancel(3T) を参照してください)。 その次に once_control を指定して pthread_once() 関数が呼び出されると、 init_routine() 関数が呼び出されます。 once_control に自動記憶領域を指定した場合、または PTHREAD_ONCE_INIT で初期化されない場合の、 pthread_once() の動作は不定です。 例いくつかのモジュールが動的に初期化されるよう設計される場合、例としては、 モジュールの最初の関数が実行されるとき、グローバルな初期化を行います。 この処理は、単一スレッドのプログラムでは、一般に次のように実現されます。 static int initialized = FALSE; マルチスレッド化されたプロセスでは、単純な初期化フラグでは十分ではないので、フラグを他のスレッドによる変更から保護しなければなりません。 つまりこのフラグは、一度だけ初期化しなければならない mutex で保護する必要があります。 マルチスレッドプログラムでは、次のように初期化を行う必要があります。 static pthread_once_t once_control = PTHREAD_ONCE_INIT; |
|||||||||||||||||||||||||||||||||||||||||||||||||
|
|||||||||||||||