2013-06-10 3 views
3

Я приближаюсь к pthreads в C, и я начинаю писать очень тупые программы, чтобы их повесить. Я попытался создать программу, содержащую два потока, они должны печатать свое имя, и их статус должен быть собран, поскольку они завершают их выполнение. Так что мой код:Неверное возвращаемое значение после завершения потока

//Function declaration 
void *state_your_name(char*); 

//Function definition 

//Passing a string as parameter for 
//outputting the name of the thread 
void *state_your_name(char *name) { 
    //Declaration of the variable containing the return status 
    void* status; 

    //Printing out the string 
    printf("%s\n", name); 
    //Exiting the thread and saving the return value 
    pthread_exit(status); 
} 

int main(void) { 
    pthread_t tid_1, tid_2; 
    void * status; 

    //Creating thread 1... 
    if (pthread_create(&tid_1, NULL, state_your_name, "Thread 1")) { 
     printf("Error creating thread 1"); 
     exit(1); 
    } 

    //Creating thread 2...  
    if (pthread_create(&tid_2, NULL, state_your_name, "Thread 2")) { 
     printf("Error creating thread 2"); 
     exit(1); 
    } 

    //Waiting for thread 1 to terminate and 
    //collecting the return value...  
    if (pthread_join(tid_1, (void *) &status)) { 
     printf("Error joining thread 1"); 
     exit(1); 
    } 
     printf("Thread 1 - Return value: %d\n", (int)status); 

    //Waiting for thread 2 to terminate and 
    //collecting the return value...  
    if (pthread_join(tid_2, (void *) &status)) { 
     printf("Error joining thread 2"); 
     exit(1); 
    } 
     printf("Thread 2 - Return value: %d\n", (int)status); 

    return 0; 
} 

Я хотел бы ожидать выход так:

Thread 1 
Thread 2 
Thread 1 - Return value: 0 
Thread 2 - Return value: 0 

но мой вопрос заключается возвращаемое значение Thread 1 является 733029576, но Thread 2 возвращает 0 как предсказывал; это как переменная статуса неинициализирована и содержит мусор. Что мне не хватает?

+0

D'о, вы никогда не инициализировать 'status'. Так что это просто неопределенное поведение. –

+0

Как вы определяете, какое значение возвращаемого значения thread1 имеет это значение? – Nicholaz

ответ

5

Причина вы видите значение мусора на выходе является то, что локальная void *status переменная state_your_name не инициализирован:

void *state_your_name(char *name) { 
    //Declaration of the variable containing the return status 
    void* status = NULL; // <<===== Add initialization here 

    //Printing out the string 
    printf("%s\n", name); 
    //Exiting the thread and saving the return value 
    pthread_exit(status); 
} 

С этим изменением в месте, ваша программа должна производить вывод, что вы ожидаете.

Обратите внимание, что возвращение status непосредственно из state_your_name является альтернативой вызова pthread_exit: вы можете заменить этот вызов с return status.

2

Ваш код в state_your_name() не инициализирует status, чтобы он возвращался, поэтому вы возвращаете неопределенную информацию. Вам не повезло, что вы получаете нуль, а не мусор.

0

Чтобы получить предсказуемо другое возвращаемое значение, попробуйте это

void *state_your_name(char *name) { 
    //Declaration of the variable containing the return status 
    void* status= (void *)(int)name[0]; 
    .... 

Это возвращает код ASCII первой букве имени.

Кроме того, реализации pthread_join я знаю, принять пустоту ** в качестве последнего параметра, так

if (pthread_join(tid_2, &status)) { 

будет правильно (ваш отливка это (void*) существо рода вводит в заблуждение)

2

Вы возвращаете указатель на status, который определен в стеке потока. Эта память может исчезнуть после выхода потока. Вы не должны объявлять status внутри своей нити. Вам лучше всего сделать return 0 внутри state_your_name().

How to return a value from thread in C См

Смежные вопросы