Как пошаговое выполнение кода работает с потоками? - PullRequest
2 голосов
/ 28 октября 2011

Я занимаюсь разработкой C ++ с Visual Studio 2010. Как пошаговое выполнение кода предназначено для создания новых потоков?

Если я выполняю код и создаю новый поток с CreateThread(), я войду в этот поток? Если нет, то почему нет?

Edit: Я получаю непредсказуемые результаты, даже с точками останова в функции потока. Иногда моя программа завершает работу до достижения точки останова в функции потока. Мне просто интересно, что вызывает такое поведение.

Ответы [ 5 ]

3 голосов
/ 28 октября 2011

Это зависит.

Если метод, вызванный 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, и он будет чередоваться между двумя потоками каждые несколько шагов.

Примечание: это не потому, что я продолжаю бить точки останова. Обе точки останова достигаются только один раз, поскольку они находятся в точке входа метода. Это просто поведение отладчика для чередования потоков, которые были явно разбиты для данной остановки в отладчике.

2 голосов
/ 28 октября 2011

Нет, я так не думаю.Вы продолжите в текущем потоке, пока точка останова не будет достигнута в другом потоке.

0 голосов
/ 28 октября 2011

Если я выполняю код и создаю новый поток с CreateThread (), я войду в этот поток?

Нет, один шаг означает, что вы проходите через контекст выполнения определенного потока. Отладчик имеет несколько способов переключаться между тем, какой поток вы просматриваете. Есть окно Threads, которое показывает вам информацию обо всех потоках в процессе. Вы также можете установить точку останова в точке входа для нового потока.

Если нет, то почему?

Поскольку отладчик не знает, что CreateThread - это специальная функция, которая запускает новый поток. Он просто знает, что вы попросили его перешагнуть через вызов функции, и поэтому он предполагает, что вы хотите остаться в текущем потоке. Кроме того, в зависимости от расписания, новый поток может начинаться или не начинаться сразу. Например, вы можете запустить новый поток в состоянии паузы.

0 голосов
/ 28 октября 2011

Нет, вы не вызываете свой метод потока напрямую (это противоречит цели потока).Вы запрашиваете, чтобы среда выполнения выполняла вашу функцию потока параллельно с текущим потоком, начиная как можно скорее.

Если у вас нет предопределенных точек останова во всех потоках, я видел, как отладчики MS отскакивали взад-впередмежду потоками, когда вы выбираете «шаг за шагом», но я не могу сказать, что могу сказать, есть ли какая-либо предсказуемость для этого.

0 голосов
/ 28 октября 2011

Выполнение будет продолжено в текущем потоке, пока не будет достигнута точка останова. Эта точка останова может находиться в отдельном потоке, и выполнение будет продолжено в том же потоке, следуя тому же правилу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...