Visual Studio 2015では、新しい空のC++プロジェクトで、コンソールアプリケーション用に以下をビルドします。
int main() {
return 0;
}
リターンにブレークポイントを設定し、デバッガでプログラムを起動します。 Windows 7では、ブレークポイント以降、このプログラムにはスレッドが1つしかありません。しかし、Windows 10では、5つのスレッド(!)があります。メインスレッドと、同期オブジェクトで待機する4つの「ワーカースレッド」です。
誰がスレッドプールを起動していますか(またはどのようにして見つけますか)?
Crystalボールは、デバッグ>ウィンドウ>スレッドウィンドウにこれらのスレッドがntdll.dll!TppWorkerThread
。 Microsoft Symbol Serverが自分でこれを表示できるようにしてください。[ツール]> [オプション]> [デバッグ]> [シンボル]を使用します。
これはVS2013でも発生するため、新しいVS2015診断機能が原因ではないことは間違いありません。@ Adamの推測は正しくありません。
TppWorkerThread()は、スレッドプールスレッドのエントリポイントです。この関数で[デバッグ]> [新しいブレークポイント]> [関数ブレークポイント]でブレークポイントを設定すると、 2番目のスレッドプールスレッドが実行を開始したときに、1番目のスレッドプールスレッドのこのスタックトレースを取得できて幸運でした。
ntdll.dll!_NtOpenFile@24() Unknown
ntdll.dll!LdrpMapDllNtFileName() Unknown
ntdll.dll!LdrpMapDllSearchPath() Unknown
ntdll.dll!LdrpProcessWork() Unknown
ntdll.dll!_LdrpWorkCallback@12() Unknown
ntdll.dll!TppWorkpExecuteCallback() Unknown
ntdll.dll!TppWorkerThread() Unknown
kernel32.dll!@BaseThreadInitThunk@12() Unknown
ntdll.dll!__RtlUserThreadStart() Unknown
> ntdll.dll!__RtlUserThreadStart@8() Unknown
明らかに、ローダーはWindows 10でスレッドプールを使用してDLLをロードしています。それは確かに新しいです:)この時点で、メインスレッドもローダーで実行されており、並行性が機能しています。
したがって、Windows 10は複数のコアを利用して、プロセスの初期化を高速化しています。非常に多くの機能であり、バグではありません:)
これはデフォルトのスレッドプールです。 https://docs.Microsoft.com/en-us/windows/desktop/procthread/thread-pools
すべてのプロセスにはデフォルトのスレッドプールがあります。