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
スレッドの作成を制御するフラグ。
値 | 意味 |
---|---|
|
スレッドは作成直後に実行されます。 |
|
スレッドは中断状態で作成され、 ResumeThread 関数が呼び出されるまで実行されません。 |
|
dwStackSize パラメーターは、スタックの初期予約サイズを指定します。 このフラグを指定しない場合、 dwStackSize はコミット サイズを指定します。 |
[out, optional] lpThreadId
スレッド識別子を受け取る変数へのポインター。 このパラメーターが NULL の場合、スレッド識別子は返されません。
戻り値
関数が成功した場合、戻り値は新しいスレッドへのハンドルです。
関数が失敗した場合は、返される値は NULL です。 詳細なエラー情報を得るには、GetLastError を呼び出します。
lpStartAddress がデータ、コード、またはアクセスできない場合でも、CreateThread は成功する可能性があることに注意してください。 スレッドの実行時に開始アドレスが無効な場合は、例外が発生し、スレッドが終了します。 無効な開始アドレスによるスレッド終了は、スレッドのプロセスのエラー出口として処理されます。 この動作は 、CreateProcess の非同期の性質に似ています。このプロセスは、無効または不足しているダイナミック リンク ライブラリ (DLL) を参照している場合でも作成されます。
注釈
プロセスで作成できるスレッドの数は、使用可能な仮想メモリによって制限されます。 既定では、すべてのスレッドには 1 MB のスタック領域があります。 したがって、32 ビット システム /3GB
で 2,048 以上のスレッドを作成することはできません。オプション boot.ini。 既定のスタック サイズを小さくすると、より多くのスレッドを作成できます。 ただし、プロセッサごとに 1 つのスレッドを作成し、アプリケーションがコンテキスト情報を保持する要求のキューをビルドすると、アプリケーションのパフォーマンスが向上します。 スレッドは、次のキューで要求を処理する前に、キュー内のすべての要求を処理します。
新しいスレッド ハンドルは、 THREAD_ALL_ACCESS アクセス権を使用して作成されます。 スレッドの作成時にセキュリティ記述子が指定されていない場合は、スレッドを作成するプロセスのプライマリ トークンを使用して、新しいスレッドに対して既定のセキュリティ記述子が構築されます。 呼び出し元が OpenThread 関数を使用してスレッドにアクセスしようとすると、呼び出し元の有効なトークンがこのセキュリティ記述子に対して評価され、アクセスを許可または拒否します。
新しく作成されたスレッドは、 GetCurrentThread 関数を呼び出すときにそれ自体に対するフル アクセス権を持ちます。
Windows Server 2003: スレッド自体へのアクセス権は、スレッド用に構築された既定のセキュリティ記述子に対してスレッドが作成されたプロセスのプライマリ トークンを評価することによって計算されます。 スレッドがリモート プロセスで作成された場合は、リモート プロセスのプライマリ トークンが使用されます。 その結果、 GetCurrentThread を呼び出すときに、新しく作成されたスレッド自体へのアクセス権が低下する可能性があります。 THREAD_SET_THREAD_TOKENやTHREAD_GET_CONTEXTを含む一部のアクセス権が存在せず、予期しないエラーが発生する可能性があります。 このため、別のユーザーの偽装中にスレッドを作成することはお勧めしません。
スレッドが実行可能な状態で作成された場合 (つまり、 CREATE_SUSPENDED フラグが使用されていない場合)、 CreateThread が返される前、特に呼び出し元が作成されたスレッドのハンドルと識別子を受け取る前に、スレッドの実行を開始できます。
スレッドの実行は、 lpStartAddress パラメーターで指定された関数から開始されます。 この関数が戻った場合、 DWORD 戻り値を使用して 、ExitThread 関数の暗黙的な呼び出しでスレッドを終了します。 GetExitCodeThread 関数を使用して、スレッドの戻り値を取得します。
スレッドは、スレッドの優先度 が THREAD_PRIORITY_NORMAL で作成されます。 スレッドの優先度値を取得および設定するには、 GetThreadPriority 関数と SetThreadPriority 関数を使用します。
スレッドが終了すると、スレッド オブジェクトはシグナル状態を取得し、オブジェクトで待機していたスレッドを満たします。
スレッド オブジェクトは、スレッドが終了し、それに対するすべてのハンドルが CloseHandle の呼び出しによって閉じられるまで、システム内に残ります。
ExitProcess、ExitThread、CreateThread、CreateRemoteThread 関数、および (CreateProcess による呼び出しの結果として) 開始されるプロセスは、プロセス内で相互にシリアル化されます。 これらのイベントのうち、一度に 1 つのアドレス空間で発生できるイベントは 1 つだけです。 これは、次の制限が保持されることを意味します。
- プロセスの起動および DLL 初期化ルーチン中に、新しいスレッドを作成できますが、プロセスに対して DLL の初期化が行われるまで実行は開始されません。
- プロセス内のスレッドは、一度に 1 つの DLL 初期化またはデタッチ ルーチンに含めることができます。
- ExitProcess は、DLL 初期化ルーチンまたはデタッチ ルーチンにスレッドが存在しない限り完了しません。
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 アプリ] |
対象プラットフォーム | Windows |
ヘッダー | processthreadsapi.h (Windows Server 2003、Windows Vista、Windows 7、Windows Server 2008 Windows Server 2008 R2 の Windows.h を含む) |
Library | Kernel32.lib;Windows Phone 8.1 の WindowsPhoneCore.lib |
[DLL] | Kernel32.dll;Windows Phone 8.1 での KernelBase.dll |