Як послідовність коду працює з потоками?

Я розробляю C ++ з Visual Studio 2010. Як розробляється кодування для створення нових потоків?

Якщо я проходжу через код, і я порожу нову нитку за допомогою CreateThread() , чи я буду входити в цю нитку? Якщо ні, то чому б і ні?

Edit: I am getting unpredictable results, even with breakpoints in the thread function. Sometimes my program exits before hitting a breakpoint in the thread function. I am just wondering about what gives rise to this behavior.

2
Ви пробували це?
додано Автор Daniel A. White, джерело
Так, я спробував це, побачив редагування.
додано Автор Matt Montag, джерело
як правило, ви не переходите в багатопотоковий додаток, швидше за все, ви хочете встановити точок зупинки в цікавих місцях та призупинити всі потоки, коли буде досягнуто точку зупинки.
додано Автор Gene Bushuyev, джерело

5 Відповіді

Це залежить.

Якщо метод, який називається 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, і це буде чергувати між двома нитки, щоразу кілька кроків.

Примітка. Це не тому, що я постійно торкаюся точок зупинки. Обидва точки зупинки торкаються лише один раз, оскільки вони знаходяться в точці вводу методу. Просто поведінка відладчика чергувала між потоками, які були явним чином розбиті на певну зупинку в налагодженні.

3
додано

Ні, я так не думаю. Ви продовжуватимете поточну нитку, поки точку зупинки не потраплять в іншу гілку.

2
додано

Якщо я проходжу через код, і я породжую нову нитку за допомогою CreateThread (), я буду вводити цю нитку?

Ні, єдиний крок означає, що ви переходите через контекст виконання конкретного потоку. Налагоджувач має кілька способів змінити потоки, які ви переглядаєте. Тут є вікно «Потоки», яке показує вам інформацію про всі потоки процесу. Ви також можете встановити точку зупинки в точці вводу для нової нитки.

Якщо ні, то чому б і ні?

Оскільки відладчик не знає, що CreateThread - це спеціальна функція, яка запускає нову гілку. Він просто знає, що ви попросили перейти на виклик функції, і тому він припускає, що ви хочете залишитися в поточній ниві. Крім того, залежно від планування, нова гілка може або не починатись відразу. Ви можете, наприклад, запустити нову нитку в призупиненому стані.

0
додано

Виконання буде продовжуватись у поточній гілці, доки не буде досягнуто точка зупинки. Ця точка переривання може бути в окремому потоці, і виконання буде виконуватися в цій гілці за цим самим правилом.

0
додано

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

Якщо у вас немає заздалегідь визначених точок зупинки в усіх потоках, я бачив, що MS відладчики відскакують між потоками назад і вперед, коли ви вибираєте «переступити», але я не можу сказати, що я можу сказати, якщо для нього є якась передбачуваність.

0
додано
IT KPI C/С++ новым годом
IT KPI C/С++ новым годом
747 учасників

Чат обсуждения С/С++. - Вопросы "напишите за меня лабу" - это оффтоп. - Оффтоп, флуд, оскорбления и вбросы здесь не приняты. - За нарушение - предупреждение или mute на неделю. - За спам и рекламу - ban. Все чаты IT KPI: https://t.me/itkpi/1147