Многопоточная программа, выполняющая только последний созданный поток?

0

Я создал 4 потока, но когда я выполняю эту программу, я получаю это как вывод:

Thread #: 1  
Thread #: 2 
Thread #: 3 
Thread #: 3 
Thread #: 4 
Thread #: 4 
Thread #: 4
Thread #: 5 
Thread #: 5 
Thread #: 5
.
.
.
Thread #: 5 
Thread #: 5 

У меня есть 2 вопроса:

  1. Я создал только 4 потока, так почему он показывает поток #: 5
  2. Все созданные 4 потока должны выполняться последовательно, но почему он запускает только последний созданный поток?

Исходный код:

#include<windows.h>


HANDLE ThreadHandle[4];
DWORD dwThreadId[4];

DWORD WINAPI ThreadFunction(LPVOID param)
{

    while (1)
    {

        printf("Thread #: %d\n", *((int*)param));
    }

    Sleep(10);

    return 0;
}

int main()
{
    static int i = 0;
    for (i = 1; i <= 4; i++)
    {
        ThreadHandle[i] = CreateThread(NULL, 0, ThreadFunction, (LPVOID)&i, 0, &dwThreadId[i]);
        Sleep(10);

    }       
    while (1)
    {
        Sleep(100);
    }
    return 0;
}
  • 2
    Массивы индексируются нулем в C. Запись в ThreadHandle[4] является неопределенным поведением.
  • 0
    И код не будет компилироваться с текущим использованием {}. И параллельный вывод консоли ...
Теги:
multithreading

1 ответ

7
Лучший ответ

i - статическая переменная - есть только один экземпляр. Вы передаете свой адрес в потоки и разыгрываете его каждый раз, когда вы вызываете printf. Поэтому, когда основной поток изменяет значение i, все рабочие потоки сразу видят новое значение. По этой причине вы видите поток # 5 - значение i после завершения цикла for().

Вместо (LPVOID)&i, pass (LPVOID)i и внутри потока используйте (int)param вместо параметра *((int*)param). Указатели каста на int и back являются законными в C (хотя и опасны, если их неправильно использовать).

Ещё вопросы

Сообщество Overcoder
Наверх
Меню