Вы передаете адрес i в качестве аргумента. После окончания цикла значение i будет равно 5. Все потоки спят в течение 2 секунд и выводят одинаковое значение.
(* аннулируются) & я
pthread_create(&id[i], NULL, dretva, (void*)&i);
Вы можете использовать массив для хранения информации.
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
void *dretva (void *x)
{
sleep(2);
printf("%d\n", *((int *)x));
return NULL;
}
int main()
{
pthread_t id[5];
int args[5];
int i;
for(i=0;i<5;i++)
{ int j;
args[i] = i; // storing tid
pthread_create(&id[i], NULL, dretva, &args[i]);
}
sleep(5);
return 0;
}