web-dev-qa-db-ja.com

Windows 10がプログラムで追加のスレッドを開始するのはなぜですか?

Visual Studio 2015では、新しい空のC++プロジェクトで、コンソールアプリケーション用に以下をビルドします。

int main() {
    return 0;
}

リターンにブレークポイントを設定し、デバッガでプログラムを起動します。 Windows 7では、ブレークポイント以降、このプログラムにはスレッドが1つしかありません。しかし、Windows 10では、5つのスレッド(!)があります。メインスレッドと、同期オブジェクトで待機する4つの「ワーカースレッド」です。

誰がスレッドプールを起動していますか(またはどのようにして見つけますか)?

35
Adrian McCarthy

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は複数のコアを利用して、プロセスの初期化を高速化しています。非常に多くの機能であり、バグではありません:)

27
Hans Passant

これはデフォルトのスレッドプールです。 https://docs.Microsoft.com/en-us/windows/desktop/procthread/thread-pools

すべてのプロセスにはデフォルトのスレッドプールがあります。

3
Changming Sun