终止线程后返回值错误

时间:2013-06-10 16:35:46

标签: c pthreads return-value

我正在接近C中的pthreads,我开始编写非常愚蠢的程序来掌握它们。我试图创建一个包含两个线程的程序,他们应该打印他们的名字,并在终止执行时收集他们的状态。所以我的代码是:

//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;就像状态变量未初始化并包含垃圾一样。我错过了什么?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:2)

state_your_name()中的代码未初始化它返回的status,因此您会收到不确定的信息。你不幸的是你得到零而不是垃圾。

答案 2 :(得分:2)

您正在返回指向线程堆栈中定义的status的指针。线程退出后,该内存可能会消失。你不应该在你的线程中声明status。你最好只在return 0内做state_your_name()

请参阅How to return a value from thread in C

答案 3 :(得分:0)

要获得可预测的不同返回值,请尝试此

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

这将返回名称第一个字母的ascii代码。

另外,我知道pthread_join的实现,将void **作为最后一个参数,所以

if (pthread_join(tid_2, &status)) {

是正确的(你的演员(void*)有点误导)