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

Я создал 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;
}

1 ответ

Решение

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

Вместо (LPVOID)&i, проходить (LPVOID)iи внутри нити используйте (int)param вместо *((int*)param), Приведение указателей на int и обратно разрешено в C (хотя и опасно, если его неправильно использовать).

Другие вопросы по тегам