c - 线程终止后返回值错误

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

最佳答案

您在输出中看到垃圾值的原因是 state_your_name 的本地 void *status 变量未初始化:

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);
}

进行此更改后,您的程序应该会产生您期望的输出。

请注意,直接从 state_your_name 返回 status 是调用 pthread_exit 的替代方法:您可以用 return status< 替换该调用.

关于c - 线程终止后返回值错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17028729/

相关文章:

c - 适用于 Linux 的 Windows Beep()

c - 如何为 pthread 堆栈正确分配内存

C++ - 何时为使用但未分配的对象调用析构函数?

c - 初始化数组 - 警告 : assignment makes integer from pointer without a cast

c - 分析 Unix 中 C 语言中每个函数的内存使用情况

c - 如何终止无限循环(线程)

c++ - 如何关闭线程(pthread 库)?

ruby - 初始化方法的返回值

c++ - a+b的值和char类型

c - 查找二进制数中的前导 1