本文に進む 日本−日本語
日本HPホーム 製品とサービス お客様サポート/ ダウンロード ソリューション ご購入の方法
≫ お問い合わせ
詳細検索オプション
日本HPホーム
HP-UX リファレンス: セクション 3 : ライブラリ (N~Z) > p

pthread_once(3T)

pthread ライブラリ
HP-UX 11i Version 2: September 2004
≫ 

テクニカル ドキュメント

PDF版
フィードバック
ここから本文が始まります

 ≫ 目次

 ≫ 索引

名称

pthread_once() ― 初期化ルーチンの一度だけの呼び出し

構文

#include <pthread.h> 
 
pthread_once_t once_control = PTHREAD_ONCE_INIT; 
 
int pthread_once( 
   pthread_once_t *once_control, 
   void (*init_routine)(void) 
); 

パラメータ

once_control  

アプリケーションで一度だけ実行される初期化関数 init_routine() に関連付ける、once_control オブジェクトへのポインター。

init_routine  

一度だけ実行される初期化ルーチン。 このルーチンは、このパラメータやこれに関連付けられた once_controlpthread_once() に何度渡されても、ただ一度だけ呼び出されます。

説明

pthread_once() 関数は、アプリケーションで init_routine() が 1 回だけ呼び出されることを保証します。 この関数は、 init_routine()pthread_once() を介して以前に呼び出されたか判断するために、 once_control オブジェクトを使用します。

最初に once_controlinit_routine() を指定して pthread_once() を呼び出すと、引き数無しで init_routine() が呼び出されます。 それ以降、同じ once_controlpthread_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() の動作は不定です。

戻り値

正常終了すると pthread_once() は 0 を返します。 それ以外の場合、エラーの内容を表すエラー番号を返します (errno 変数は使用しません)。

エラー

以下の条件の場合、 pthread_once() 関数は、該当するエラー番号を返します。

[EINVAL] 

once_control または init_routine が無効の場合。

いくつかのモジュールが動的に初期化されるよう設計される場合、例としては、 モジュールの最初の関数が実行されるとき、グローバルな初期化を行います。 この処理は、単一スレッドのプログラムでは、一般に次のように実現されます。

static int initialized = FALSE; 
extern void initialize(); 
 
if (!initialized) { 
    initialize(); 
    initialized = TRUE; 
} 
 
省略 

マルチスレッド化されたプロセスでは、単純な初期化フラグでは十分ではないので、フラグを他のスレッドによる変更から保護しなければなりません。 つまりこのフラグは、一度だけ初期化しなければならない mutex で保護する必要があります。 マルチスレッドプログラムでは、次のように初期化を行う必要があります。

static pthread_once_t  once_control = PTHREAD_ONCE_INIT; 
extern void initialize(); 
 
(void)pthread_once(&once_control, initialize); 
 
省略 

著者

pthread_once() は、IEEE POSIX P1003.1c 標準から派生しました。

標準準拠

pthread_once(): POSIX 1003.1c.

印刷用画面へ
プライバシー 本サイト利用時の合意事項
© 1983-2004 Hewlett-Packard Development Company, L.P.