Это зависит.
Если метод, вызванный CreateThread
, когда-либо достигнет точки останова, когда вы шагаете по коду, который вызвал CreateThread
, тогда отладчик переключится на эту точку останова и поток. С этого момента (пока вы снова не нажмете F5) выполнение пошаговых инструкций (F10) будет иногда чередоваться между исходной нитью и нитью, созданной CreateThread
.
Это верно для каждого потока, который создается во время данного сеанса перерыва. Как только вы нажмете F5 и снова сломаете (через точку останова или паузу) все сбрасывается, и пошаговое выполнение будет проходить только через нить, которая была изначально разбита.
Вот пример приложения
DWORD WINAPI Thread2(LPVOID lParam)
{
while (true)
{
printf("In Thread 2\n");
}
}
int _tmain(int argc, _TCHAR* argv[])
{
CreateThread( NULL, 0, &Thread2, NULL, 0, NULL);
while (true)
{
printf("In Thread 1\n");
}
return 0;
}
Если я поставлю точку останова на функции printf
в _tmain
, нажму F5, а затем использую F10 для перехода после достижения точки останова, я никогда не буду входить в метод Thread2
.
Однако, если я установлю точку останова на обеих точках входа на _tmain
и Thread2
, а затем нажму F5, все изменится. Сначала я достигну точки останова в _tmain
, как и ожидалось. Если я продолжу нажимать F10 после этого, я в конечном итоге достигну точки останова в Thread2
. С тех пор я могу продолжать нажимать F10, и он будет чередоваться между двумя потоками каждые несколько шагов.
Примечание: это не потому, что я продолжаю бить точки останова. Обе точки останова достигаются только один раз, поскольку они находятся в точке входа метода. Это просто поведение отладчика для чередования потоков, которые были явно разбиты для данной остановки в отладчике.