Я создал 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 вопроса:
Исходный код:
#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;
}
i
- статическая переменная - есть только один экземпляр. Вы передаете свой адрес в потоки и разыгрываете его каждый раз, когда вы вызываете printf
. Поэтому, когда основной поток изменяет значение i
, все рабочие потоки сразу видят новое значение. По этой причине вы видите поток # 5 - значение i
после завершения цикла for()
.
Вместо (LPVOID)&i
, pass (LPVOID)i
и внутри потока используйте (int)param
вместо параметра *((int*)param)
. Указатели каста на int и back являются законными в C (хотя и опасны, если их неправильно использовать).
ThreadHandle[4]
является неопределенным поведением.