InitOnceExecuteOnce 関数 (synchapi.h)
複数のスレッドが同じ 1 回限りの初期化ブロックを渡して InitOnceExecuteOnce を呼び出すと、 InitFn で指定されたコールバック関数が実行されるのは 1 つのスレッドだけです。 残りのスレッドは、コールバック関数が完了するまでブロックされます。 コールバック関数が TRUE を 返して成功を示す場合、InitOnceExecuteOnce は一度にすべての呼び出し元に TRUE を 返します。 ただし、エラーを示すためにコールバックから FALSE が 返された場合、InitOnceExecuteOnce はコールバック関数を実行した 1 つのスレッドにのみ FALSE を 返します。 同時に、残りのブロックされたスレッドの 1 つがブロック解除され、 InitFn が再度実行されます。 したがって、 InitFn が断続的に失敗し、再試行が必要なシナリオでは、 TRUE が返されるまで、すべてのスレッドが InitOnceExecuteOnce を呼び出し続ける必要があります。
構文
BOOL InitOnceExecuteOnce(
[in, out] PINIT_ONCE InitOnce,
[in] PINIT_ONCE_FN InitFn,
[in, optional] PVOID Parameter,
[in, out, optional] LPVOID *Context
);
パラメーター
[in, out] InitOnce
1 回限りの初期化構造体へのポインター。
[in] InitFn
アプリケーション定義の InitOnceCallback 関数へのポインター。
[in, optional] Parameter
コールバック関数に渡されるパラメーター。
[in, out, optional] Context
成功時に 1 回限りの初期化構造で格納されたデータを受け取るパラメーター。 データの下位 INIT_ONCE_CTX_RESERVED_BITS ビットは常に 0 です。 Context がデータ構造を指す場合、データ構造は DWORD にアラインされている必要があります。 Arm32 のコード ポインターには常に最下位ビットが設定されているため、コンテキストを Arm32 のコード ポインターにすることはできません。詳細については、Arm32 ABI に関するページを参照してください。
戻り値
関数が成功すると、戻り値は 0 以外になります。
関数が失敗した場合は、0 を返します。 詳細なエラー情報を得るには、GetLastError を呼び出します。
解説
この関数は、同期的な 1 回限り初期化に使用されます。 非同期の 1 回限りの初期化では、INIT_ONCE_ASYNC フラグを指定して InitOnceBeginInitialize 関数を使用します。
InitFn で指定されたコールバック関数を実行できるのは、一度に 1 つのスレッドのみです。 コールバックが完了するまで、同じ 1 回限りの初期化構造体ブロックを指定する他のスレッド。
この関数を使用するアプリケーションをコンパイルするには、 _WIN32_WINNT を 0x0600 以降として定義します。 詳細については、「 Windows ヘッダーの使用」を参照してください。
例
この関数を使用する例については、「 One-Time 初期化の使用」を参照してください。
要件
要件 | 値 |
---|---|
サポートされている最小のクライアント | Windows Vista [デスクトップ アプリのみ | UWP アプリ] |
サポートされている最小のサーバー | Windows Server 2008 [デスクトップ アプリ | UWP アプリ] |
対象プラットフォーム | Windows |
ヘッダー | synchapi.h (Windows 7 の Windows.h、Windows Server 2008 Windows Server 2008 R2 を含む) |
Library | Kernel32.lib |
[DLL] | Kernel32.dll |