Почему Windows 10 запускает дополнительные потоки в моей программе?

С Visual Studio 2015 в новом, пустом проекте С++ создайте для консольного приложения следующее:

int main() {
    return 0;
}

Установите точку останова при возврате и запустите программу в отладчике. В Windows 7 с точки прерывания эта программа имеет только один поток. Но в Windows 10 он имеет пять (!) Потоков: основной поток и четыре "рабочих потока", ожидающих объекта синхронизации.

Кто запускает пул потоков (или как это выяснить)?

Ответы

Ответ 1

Crystal ball говорит, что окно Debug > Windows > Threads показывает эти потоки в ntdll.dll!TppWorkerThread. Обязательно включите Microsoft Symbol Server, чтобы увидеть это самостоятельно, используйте "Инструменты" > "Параметры" > "Отладка" > "Символы".

Это также происходит в VS2013, поэтому он определенно не вызван новыми диагностическими функциями VS2015, угадание @Adam не может быть правильным.

TppWorkerThread() - это точка входа для потока потока. Когда я устанавливаю точку останова с помощью Debug > New Breakpoint > Function Breakpoint для этой функции. Мне посчастливилось захватить эту трассировку стека для 1-го потока потока, когда второй поток потока ничей начал выполняться:

    [email protected]()  Unknown
    ntdll.dll!LdrpMapDllNtFileName()    Unknown
    ntdll.dll!LdrpMapDllSearchPath()    Unknown
    ntdll.dll!LdrpProcessWork() Unknown
    [email protected]()    Unknown
    ntdll.dll!TppWorkpExecuteCallback() Unknown
    ntdll.dll!TppWorkerThread() Unknown
    [email protected]@12()  Unknown
    ntdll.dll!__RtlUserThreadStart()    Unknown
>   [email protected]()  Unknown

Очевидно, что загрузчик использует threadpool в Windows 10 для загрузки DLL. Это конечно новое:) В этот момент основной поток также выполняется в загрузчике, concurrency на работе.

Таким образом, Windows 10 использует несколько ядер для ускорения процесса. Очень особенность, а не ошибка:)