CreateThread

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

CreateThread lpThreadAttributes, dwStackSize, lpStartAddress, lpParameter, dwCreationFlags, lpThreadId

lpThreadAttributes : [var] 返されるハンドルが子プロセスに継承可能かを決定する SECURITY_ATTRIBUTES 構造体へのポインタ。lpThreadAttributes が NULL の場合、ハンドルは継承できない。構造体の lpSecurityDescriptor メンバーが新しいスレッドのセキュリティ記述子を指定する。lpThreadAttributes が NULL の場合、スレッドは既定のセキュリティ記述子を取得する。スレッドの既定セキュリティ記述子の ACL は作成者のプライマリトークンから取得される。
dwStackSize : [int] スタックの初期サイズ(バイト単位)。システムはこの値を最も近いページに丸める。このパラメータがゼロの場合、新しいスレッドは実行ファイルの既定サイズを使用する。詳細は Thread Stack Size を参照。
lpStartAddress : [int] スレッドが実行するアプリケーション定義の関数へのポインタ。このポインタはスレッドの開始アドレスを表す。スレッド関数の詳細は ThreadProc を参照。
lpParameter : [intptr] スレッドに渡される変数へのポインタ。
dwCreationFlags : [int] スレッドの作成を制御するフラグ。
lpThreadId : [var] スレッド識別子を受け取る変数へのポインタ。このパラメータが NULL の場合、スレッド識別子は返されない。

(プラグイン / モジュール : kernel32.dll)

解説

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

[戻り値]
関数が成功した場合、戻り値は新しいスレッドへのハンドル。関数が失敗した場合、戻り値は NULL。拡張エラー情報を取得するには
GetLastError を呼ぶ。lpStartAddress がデータやコード、またはアクセス不可能な場所を指していても
CreateThread
は成功することがある。スレッドが実行されるとき開始アドレスが無効であれば、例外が発生しスレッドは終了する。無効な開始アドレスによるスレッドの終了はスレッドのプロセスのエラー終了として扱われる。この動作は
CreateProcess の非同期的な性質に似ており、無効な DLL や欠落した DLL を参照していてもプロセスは作成される。

[備考]
プロセスが作成できるスレッドの数は利用可能な仮想メモリによって制限される。既定では、各スレッドは 1
メガバイトのスタック領域を持つ。したがって、最大 2,048
個のスレッドを作成できる。既定のスタックサイズを減らせば、より多くのスレッドを作成できる。ただし、アプリケーションはプロセッサごとに 1
スレッドを作成し、アプリケーションがコンテキスト情報を保持する要求のキューを構築したほうがパフォーマンスが向上する。スレッドは次のキューの要求を処理する前に、そのキュー内のすべての要求を処理する。新しいスレッドハンドルは
THREAD_ALL_ACCESS
アクセス権で作成される。スレッド作成時にセキュリティ記述子が提供されない場合、スレッドを作成するプロセスのプライマリトークンを使って新しいスレッド用に既定のセキュリティ記述子が構築される。呼び出し側が
OpenThread
関数でスレッドにアクセスしようとすると、呼び出し側の実効トークンがこのセキュリティ記述子に対して評価され、アクセスが付与または拒否される。新しく作成されたスレッドは、GetCurrentThread
関数を呼ぶとき自身に対するフルアクセス権を持つ。Windows Server 2003:
スレッドの自身に対するアクセス権は、スレッドが作成されたプロセスのプライマリトークンをスレッド用に構築された既定のセキュリティ記述子に対して評価することで計算される。スレッドがリモートプロセスに作成された場合、リモートプロセスのプライマリトークンが使われる。結果として、新しく作成されたスレッドは
GetCurrentThread
を呼ぶとき自身に対するアクセス権が削減されている可能性がある。THREAD_SET_THREAD_TOKEN や
THREAD_GET_CONTEXT などのアクセス権が存在しないと、予期しない失敗につながる可能性がある。このため、別のユーザーを
impersonation している間にスレッドを作成することは推奨されない。スレッドが実行可能状態で作成された場合(つまり
CREATE_SUSPENDED フラグが使われなかった場合)、スレッドは CreateThread
が戻る前に、特に呼び出し側が作成されたスレッドのハンドルと識別子を受け取る前に実行を開始する可能性がある。スレッドの実行は
lpStartAddress パラメータで指定された関数から始まる。この関数が戻ると、その DWORD 戻り値が ExitThread
関数への暗黙的な呼び出しでスレッドを終了させるために使われる。スレッドの戻り値を取得するには GetExitCodeThread
関数を使う。スレッドはスレッド優先度 THREAD_PRIORITY_NORMAL で作成される。スレッドの優先度値を取得・設定するには
GetThreadPriority および SetThreadPriority
関数を使う。スレッドが終了すると、スレッドオブジェクトはシグナル状態となり、オブジェクトを待機していた任意のスレッドを満たす。スレッドオブジェクトは、スレッドが終了しそれへのすべてのハンドルが
CloseHandle
の呼び出しで閉じられるまでシステム内に残る。ExitProcess、ExitThread、CreateThreadCreateRemoteThread
関数と、CreateProcess
呼び出しの結果として起動するプロセスは、プロセス内で互いにシリアライズされる。これらのイベントはアドレス空間内で一度に 1
つしか発生しない。つまり、以下の制限が成り立つ:
(以下省略)

情報

プラグイン / モジュールkernel32.dll
バージョン1.0
作成日2026/04/16
著作者IronHSP / CsWin32 bridge
URLhttps://github.com/inovia/IronHSP
備考Win32 API の kernel32.dll 関数群。CsWin32 + win32metadata から自動生成。
hsp3net 専用 (intptr / NSTRUCT / wstr を使用)。
タイプ拡張命令
グループWin32API
対応環境
  • Windows 版 HSP
hs ファイルhsphelp\win32_kernel32_gen2.hs