2015-07-17 3 views
0

Я пытаюсь сделать тривиальную программу, у меня есть ввод из командной строки n int elemnts; после того, как я сделаю n потоков с аргументом числом в позиции i; после этого функция * напечатает номер i, помещенный в pthread_create.Создание темы внутри цикла

int main (int argc, char *argv[]){ 
pthread_t * tid; 
int i=0;   
int n; 
int *pn = &n; 

tid = (pthread_t *) malloc (sizeof(pthread_t)*(argc-1));     

for (i=1; i<argc; i++) { //cycle 1 
    *pn = atoi(argv[i]); 
    pthread_create(tid+i, NULL, function, (void *) pn); 
} 
for (i=0; i<argc-1; i++){ 
    pthread_join(tid[i], NULL); 
} 
return 0;} 


void *function(void * param){ 
     int *k = (int *) param; 
    printf("i got this number: %d\n", *k); 
    pthread_exit(0); 
    } 

я бегу и я получаю это:

./test 1 2 3 4 
i got this number: 3 
i got this number: 3 
i got this number: 4 
i got this number: 4 

изменение выходной всегда, но я никогда не получить правильные числа (4, 1, 2, 3) не только в таком порядке, я знаю, что я не могу получить правильный порядок (для этого я ставлю соединение внутри цикла 1). Есть ли способ решить эту проблему?

+0

Стандартное предупреждение: не отбрасывают '' недействительным *, возвращаемый 'malloc' и друзей. – Olaf

+0

Что делать, если аргументы не передаются? Всегда проверяйте результат 'malloc' – Olaf

ответ

2

Каждый поток получает один и тот же указатель, поэтому каждый ищет одну и ту же переменную. В результате вы попадаете в состояние гонки.

Вы должны пройти каждый нить свою собственную переменную:

int *n = malloc(argc * sizeof(int)); 
if (n == NULL) { 
    perror("malloc failed"); 
    exit(1); 
} 
for (i=1; i<argc; i++) { //cycle 1 
    n[i] = atoi(argv[i]); 
    pthread_create(tid+i, NULL, function, (void *) &n[i]); 
} 
Смежные вопросы