次の方法で共有


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

関連項目

InitOnceCallback

InitOnceInitialize

1 回限り初期化

同期関数