Идеальный способ сделать это - сообщить потоку, какой он находится во время создания. Вы можете сделать это, передав идентификатор потока в качестве аргумента. Вот способ, которым вы можете сделать это:
void *printMsg(void *tnum_p) {
int tnum = *(int *)tnum_p;
printf("%d\n", tnum);
return NULL;
}
int main() {
int i = 0;
int n = 0;
printf("Enter number of threads: ");
scanf("%d", &n);
pthread_t tid[n];
int tnum[n];
for(i = 0; i < n; i++) {
tnum[i] = i;
pthread_create(&(tid[i]), NULL, &printMsg, &(tnum[i]));
}
for (i = 0; i < n; i++) {
pthread_join(tid[i], NULL);
}
return 0;
}
Можно подумать, что мы могли бы просто передать &i
вместо &(tnum[i])
; это скомпилирует безо всякой ошибки, но тогда каждый поток получит один и тот же адрес, и это будет зависеть от удачи и времени, что каждый поток найдет там (то есть почти наверняка у вас будут повторяющиеся числа).
(Я также предпочитаю tid + i
и tnum + i
вместо &(tid[i])
и &(tnum[i])
, но это только я.)
Если вам нужно отправить любую другую информацию, тогда сделайте struct
для переноса все, что вам нужно, вместо передачи int
.