次の方法で共有


CreateThread 関数 (processthreadsapi.h)

呼び出し元プロセスの仮想アドレス空間内で実行するスレッドを作成します。

別のプロセスの仮想アドレス空間で実行されるスレッドを作成するには、CreateRemoteThread 関数を使用します。

構文

HANDLE CreateThread(
  [in, optional]  LPSECURITY_ATTRIBUTES   lpThreadAttributes,
  [in]            SIZE_T                  dwStackSize,
  [in]            LPTHREAD_START_ROUTINE  lpStartAddress,
  [in, optional]  __drv_aliasesMem LPVOID lpParameter,
  [in]            DWORD                   dwCreationFlags,
  [out, optional] LPDWORD                 lpThreadId
);

パラメーター

[in, optional] lpThreadAttributes

返されたハンドルを子プロセスによって継承できるかどうかを決定する SECURITY_ATTRIBUTES 構造体へのポインター。 lpThreadAttributes が NULL の場合、ハンドルを継承できません。

構造体の lpSecurityDescriptor メンバーは、新しいスレッドのセキュリティ記述子を指定します。 lpThreadAttributes が NULL の場合、スレッドは既定のセキュリティ記述子を取得します。 スレッドの既定のセキュリティ記述子の ACL は、作成者のプライマリ トークンから取得されます。

[in] dwStackSize

スタックの初期サイズ (バイト単位)。 システムは、この値を最も近いページに丸めます。 このパラメーターが 0 の場合、新しいスレッドは実行可能ファイルの既定のサイズを使用します。 詳細については、「スレッド スタック サイズのを する」を参照してください。

[in] lpStartAddress

スレッドによって実行されるアプリケーション定義関数へのポインター。 このポインターは、スレッドの開始アドレスを表します。 スレッド関数の詳細については、「ThreadProc」を参照してください。

[in, optional] lpParameter

スレッドに渡される変数へのポインター。

[in] dwCreationFlags

スレッドの作成を制御するフラグ。

価値 意味
0
スレッドは作成直後に実行されます。
CREATE_SUSPENDED
0x00000004
スレッドは中断状態で作成され、ResumeThread 関数が呼び出されるまで実行されません。
STACK_SIZE_PARAM_IS_A_RESERVATION
0x00010000
dwStackSize パラメーターは、スタックの初期予約サイズを指定します。 このフラグを指定しない場合は、dwStackSize コミット サイズを指定します。

[out, optional] lpThreadId

スレッド識別子を受け取る変数へのポインター。 このパラメーターが NULL場合、スレッド識別子は返されません。

戻り値

関数が成功した場合、戻り値は新しいスレッドへのハンドルです。

関数が失敗した場合、戻り値は NULL。 拡張エラー情報を取得するには、GetLastError呼び出します。

lpStartAddress がデータ、コード、またはアクセスできない場合でも、CreateThread は成功する可能性があることに注意してください。 スレッドの実行時に開始アドレスが無効な場合は、例外が発生し、スレッドが終了します。 無効な開始アドレスによるスレッド終了は、スレッドのプロセスのエラー出口として処理されます。 この動作は、CreateProcessの非同期の性質に似ています。この場合、プロセスは無効または不足しているダイナミック リンク ライブラリ (DLL) を参照している場合でも作成されます。

備考

プロセスで作成できるスレッドの数は、使用可能な仮想メモリによって制限されます。 既定では、すべてのスレッドには 1 MB のスタック領域があります。 そのため、32 ビット システムで 2,048 以上のスレッドを作成 /3GB boot.ini オプションはありません。 既定のスタック サイズを小さくすると、さらにスレッドを作成できます。 ただし、プロセッサごとに 1 つのスレッドを作成し、アプリケーションがコンテキスト情報を保持する要求のキューをビルドすると、アプリケーションのパフォーマンスが向上します。 スレッドは、次のキューで要求を処理する前に、キュー内のすべての要求を処理します。

新しいスレッド ハンドルは、THREAD_ALL_ACCESS アクセス権を使用して作成されます。 スレッドの作成時にセキュリティ記述子が指定されていない場合は、スレッドを作成するプロセスのプライマリ トークンを使用して、新しいスレッドに対して既定のセキュリティ記述子が構築されます。 呼び出し元が OpenThread 関数を使用してスレッドにアクセスしようとすると、呼び出し元の有効なトークンがこのセキュリティ記述子に対して評価され、アクセスが許可または拒否されます。

新しく作成されたスレッドは、GetCurrentThread 関数を呼び出すときに、それ自体に対するフル アクセス権を持ちます。

Windows Server 2003: スレッド自体へのアクセス権は、スレッド用に構築された既定のセキュリティ記述子に対してスレッドが作成されたプロセスのプライマリ トークンを評価することによって計算されます。 スレッドがリモート プロセスで作成された場合は、リモート プロセスのプライマリ トークンが使用されます。 その結果、新しく作成されたスレッドは、GetCurrentThread呼び出すときに、それ自体へのアクセス権を減らす可能性があります。 THREAD_SET_THREAD_TOKENTHREAD_GET_CONTEXT を含む一部のアクセス権が存在せず、予期しないエラーが発生する可能性があります。 このため、別のユーザーの偽装中にスレッドを作成することはお勧めしません。

スレッドが実行可能な状態で作成された場合 (つまり、CREATE_SUSPENDED フラグが使用されていない場合)、CreateThread が返される前、特に呼び出し元が作成されたスレッドのハンドルと識別子を受け取る前に、スレッドの実行を開始できます。

スレッドの実行は、lpStartAddress パラメーターで指定された関数から開始されます。 この関数が戻った場合、DWORD 戻り値を使用して、ExitThread 関数への暗黙的な呼び出しでスレッドを終了します。 GetExitCodeThread 関数を使用して、スレッドの戻り値を取得します。

スレッドは、スレッドの優先度が THREAD_PRIORITY_NORMALで作成されます。 GetThreadPriority と SetThreadPriority 関数 使用して、スレッドの優先度値を取得および設定します。

スレッドが終了すると、スレッド オブジェクトはシグナル状態を取得し、オブジェクトで待機していたスレッドを満たします。

スレッド オブジェクトは、スレッドが終了し、それに対するすべてのハンドルが CloseHandleの呼び出しによって閉じられるまで、システム 残ります。

ExitProcessExitThreadCreateThreadCreateRemoteThread 関数、および (CreateProcessによる呼び出しの結果として) 開始されるプロセスは、プロセス内で相互にシリアル化されます。 一度に発生できるイベントは、アドレス空間内で 1 つだけです。 これは、次の制限が保持されることを意味します。

  • プロセスの起動および DLL 初期化ルーチン中に、新しいスレッドを作成できますが、プロセスに対して DLL の初期化が行われるまで実行は開始されません。
  • プロセス内のスレッドは、一度に 1 つの DLL 初期化またはデタッチ ルーチンに含めることができます。
  • ExitProcess は、DLL 初期化ルーチンまたはデタッチ ルーチンにスレッドが存在しない限り完了しません。
C ランタイム ライブラリ (CRT) を呼び出す実行可能ファイル内のスレッドは、CreateThread と ExitThreadを するのではなく、スレッド管理に _beginthreadex 関数と _endthreadex 関数 使用する必要があります。これには、マルチスレッド バージョンの CRT を使用する必要があります。 CreateThread を使用して作成されたスレッドが CRT を呼び出すと、CRT はメモリ不足の状態でプロセスを終了する可能性があります。

Windows Phone 8.1: この機能は、Windows Phone 8.1 以降の Windows Phone ストア アプリでサポートされています。

Windows 8.1 および windows Server 2012 R2: この関数は、Windows 8.1、Windows Server 2012 R2 以降の Windows ストア アプリでサポートされています。

例については、「スレッドの作成」を参照してください。

必要条件

要件 価値
サポートされる最小クライアント Windows XP [デスクトップ アプリ |UWP アプリ]
サポートされる最小サーバー Windows Server 2003 [デスクトップ アプリ |UWP アプリ]
ターゲット プラットフォーム の ウィンドウズ
ヘッダー processthreadsapi.h (Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2 の Windows.h を含む)
ライブラリ Kernel32.lib;Windows Phone 8.1 の WindowsPhoneCore.lib
DLL Kernel32.dll;Windows Phone 8.1 での KernelBase.dll

関連項目

CloseHandle の

CreateProcess の

CreateRemoteThread の

ExitProcess の

ExitThread の

GetExitCodeThread の

GetThreadPriority を する

プロセス関数とスレッド関数の

ResumeThread

SECURITY_ATTRIBUTES

SetThreadPriority の

SuspendThread の

ThreadProc の

スレッド