Вам необходимо создать структуру данных для каждого из потоков, поскольку вы перезаписываете значение input.h для каждого из потоков.
Таким образом, чтобы исправить это, измените его на
DataStructure *input;
...
for (int i = 0; i < 8; i++)
{
input = new DataStructure ;
input->h=i;
hThread[i] = (HANDLE)_beginthreadex( NULL, 0, f2, (void*)input, 0, &threadID );
}
И чтобы избежать утечки памяти, используйте функцию f2 для удаления ввода, т.е.
unsigned __stdcall f2(void *p)
{
DataStructure *input = (DataStructure *)p;
int i = input->h;
cout <<i<<endl;
delete input;
return 0;
}
note Это решение использует динамическое распределение памяти, что является хорошим решением, если число потоковнеизвестно во время компиляции.Смотрите мой другой ответ, если число потоков известно.