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
備考
プロセスで作成できるスレッドの数は、使用可能な仮想メモリによって制限されます。 既定では、すべてのスレッドには 1 MB のスタック領域があります。 そのため、32 ビット システムで 2,048 以上のスレッドを作成 /3GB
boot.ini オプションはありません。 既定のスタック サイズを小さくすると、さらにスレッドを作成できます。 ただし、プロセッサごとに 1 つのスレッドを作成し、アプリケーションがコンテキスト情報を保持する要求のキューをビルドすると、アプリケーションのパフォーマンスが向上します。 スレッドは、次のキューで要求を処理する前に、キュー内のすべての要求を処理します。
新しいスレッド ハンドルは、THREAD_ALL_ACCESS アクセス権を使用して作成されます。 スレッドの作成時にセキュリティ記述子が指定されていない場合は、スレッドを作成するプロセスのプライマリ トークンを使用して、新しいスレッドに対して既定のセキュリティ記述子が構築されます。 呼び出し元が OpenThread 関数を使用してスレッドにアクセスしようとすると、呼び出し元の有効なトークンがこのセキュリティ記述子に対して評価され、アクセスが許可または拒否されます。
新しく作成されたスレッドは、GetCurrentThread 関数を呼び出すときに、それ自体に対するフル アクセス権を持ちます。
Windows Server 2003: スレッド自体へのアクセス権は、スレッド用に構築された既定のセキュリティ記述子に対してスレッドが作成されたプロセスのプライマリ トークンを評価することによって計算されます。 スレッドがリモート プロセスで作成された場合は、リモート プロセスのプライマリ トークンが使用されます。 その結果、新しく作成されたスレッドは、GetCurrentThread
スレッドが実行可能な状態で作成された場合 (つまり、
スレッドの実行は、lpStartAddress パラメーターで指定された関数から開始されます。 この関数が戻った場合、DWORD 戻り値を使用して、ExitThread 関数への暗黙的な呼び出しでスレッドを終了します。 GetExitCodeThread 関数を使用して、スレッドの戻り値を取得します。
スレッドは、スレッドの優先度が THREAD_PRIORITY_NORMALで作成されます。
スレッドが終了すると、スレッド オブジェクトはシグナル状態を取得し、オブジェクトで待機していたスレッドを満たします。
スレッド オブジェクトは、スレッドが終了し、それに対するすべてのハンドルが CloseHandleの呼び出しによって閉じられるまで、システム
ExitProcess、ExitThread、CreateThread、CreateRemoteThread 関数、および (CreateProcessによる呼び出しの結果として) 開始されるプロセスは、プロセス内で相互にシリアル化されます。 一度に発生できるイベントは、アドレス空間内で 1 つだけです。 これは、次の制限が保持されることを意味します。
- プロセスの起動および DLL 初期化ルーチン中に、新しいスレッドを作成できますが、プロセスに対して DLL の初期化が行われるまで実行は開始されません。
- プロセス内のスレッドは、一度に 1 つの DLL 初期化またはデタッチ ルーチンに含めることができます。
- ExitProcess は、DLL 初期化ルーチンまたはデタッチ ルーチンにスレッドが存在しない限り完了しません。
Windows Phone 8.1: この機能は、Windows Phone 8.1 以降の Windows Phone ストア アプリでサポートされています。
例
例については、「スレッドの作成」を参照してください。
必要条件
要件 | 価値 |
---|---|
サポートされる最小クライアント | 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 を
SetThreadPriority の
SuspendThread の
ThreadProc の