C 为什么pthread返回的值与传递给thread函数的值不同?

C 为什么pthread返回的值与传递给thread函数的值不同?,c,pthreads,posix,C,Pthreads,Posix,我的理解是,我的程序应该输出与我提供给printxs的值相同的值,但获得的输出是: Message from printxs 11131 a Message from printxs 11234 b 32766 -16 32766 0 该方案: #include<stdio.h> #include<pthread.h> typedef struct paramsThread{ char c; int count; } threadPar

我的理解是,我的程序应该输出与我提供给
printxs
的值相同的值,但获得的输出是:

Message from printxs 11131 a
Message from printxs 11234 b
32766 -16
32766 0
该方案:

#include<stdio.h>
#include<pthread.h>

typedef struct paramsThread{
        char c;
        int count;
} threadPara;

void* print_xs(void* unused){
        threadPara *tp = (threadPara *)unused;
        int i=tp->count;

        printf("Message from printxs %d %c\n", tp->count, tp->c);
        return (void*)tp;
}

int main(){
        pthread_t thread1, thread2;
        threadPara t1,t2,t3,t4;
        t1.c = 'a';
        t2.c = 'b';
        t1.count = 11131;
        t2.count = 11234;
        t3.count=0;
        pthread_create(&thread1, NULL, &print_xs, &t1);
        pthread_create(&thread2, NULL, &print_xs, &t2);
        pthread_join(thread1,(void*)&t3);
        printf("%d %d\n", t3.count, t3.c);
        pthread_join(thread2,(void*)&t4);
        printf("%d %d\n", t4.count, t4.c);
        return 0;
}
#包括
#包括
类型定义结构参数线程{
字符c;
整数计数;
}丝线对位;
作废*打印(作废*未使用){
threadPara*tp=(threadPara*)未使用;
int i=tp->count;
printf(“来自printxs%d%c\n的消息”,tp->count,tp->c);
返回(无效*)tp;
}
int main(){
pthread_t thread1,thread2;
第t1、t2、t3、t4段;
t1.c='a';
t2.c=‘b’;
t1.count=11131;
t2.count=11234;
t3.计数=0;
pthread_create(&thread1,NULL,&print_xs,&t1);
pthread_create(&thread2,NULL,&print_xs,&t2);
pthread_join(thread1,(void*)和t3);
printf(“%d%d\n”,t3.count,t3.c);
pthread_join(thread2,(void*)和t4);
printf(“%d%d\n”,t4.count,t4.c);
返回0;
}
有人能解释为什么会发生这种情况吗?

如果您看到第二个参数是指向指针的指针。这是一种在C中模拟按引用传递的方法

线程函数返回的指针被复制到另一个指针中

解决方案是使用
t3
t4
的指针:

threadPara t1, t2;
threadPara *t3, *t4;

// ...

pthread_join(thread1,(void**)&t3);  // Pass pointer to the pointer, emulating pass by reference
printf("%d %d\n", t3->count, t3->c);
pthread_join(thread2,(void**)&t4);
printf("%d %d\n", t4->count, t4->c);
如果您打印指针或使用调试器,那么您将看到
t3
将指向
t1
(即
t3==&t1
),如果您将看到第二个参数是指向指针的指针,那么
t4
t2
也是如此。这是一种在C中模拟按引用传递的方法

线程函数返回的指针被复制到另一个指针中

解决方案是使用
t3
t4
的指针:

threadPara t1, t2;
threadPara *t3, *t4;

// ...

pthread_join(thread1,(void**)&t3);  // Pass pointer to the pointer, emulating pass by reference
printf("%d %d\n", t3->count, t3->c);
pthread_join(thread2,(void**)&t4);
printf("%d %d\n", t4->count, t4->c);

如果打印指针或使用调试器,则会看到
t3
将指向
t1
(即
t3==&t1
),对于
t4
t2
,线程函数将返回一个地址
void*

接收第二个参数(a
void**
)指向的地址

因此,在代码中使用它,而不是

        pthread_join(thread1, (void*)&t3);


作为旁注:在C语言中,没有必要将指针转换成或从
void
-指针从其他指针转换成或从其他指针转换成,所涉及的指针会被隐式转换

所以这个代码

void* print_xs(void* unused){
    threadPara *tp = (threadPara *)unused;
    int i=tp->count;

    printf("Message from printxs %d %c\n", tp->count, tp->c);
    return (void*)tp;
}
很可能是这样写的:

void* print_xs(void* unused){
    threadPara *tp = unused;
    int i=tp->count;

    printf("Message from printxs %d %c\n", tp->count, tp->c);
    return tp;
}

线程函数返回一个地址,
void*

接收第二个参数(a
void**
)指向的地址

因此,在代码中使用它,而不是

        pthread_join(thread1, (void*)&t3);


作为旁注:在C语言中,没有必要将指针转换成或从
void
-指针从其他指针转换成或从其他指针转换成,所涉及的指针会被隐式转换

所以这个代码

void* print_xs(void* unused){
    threadPara *tp = (threadPara *)unused;
    int i=tp->count;

    printf("Message from printxs %d %c\n", tp->count, tp->c);
    return (void*)tp;
}
很可能是这样写的:

void* print_xs(void* unused){
    threadPara *tp = unused;
    int i=tp->count;

    printf("Message from printxs %d %c\n", tp->count, tp->c);
    return tp;
}

在threadprog.c:2:0:/usr/include/pthread.h:261:12中包含的文件中获取此错误:注意:应为“void**”,但参数的类型为“struct threadPara**”extern int pthread_join(pthread_t_th,void**uu thread_return);^这是否意味着我必须创建一个void指针>然后接收返回值>typecast>use???@PrinceRachit?您认为应该如何解决这个问题?阅读错误消息,直到您找到答案。(是的,我在回答中犯了一个错误)是的,我改正了。我注意到你也更新了答案。谢谢在threadprog.c:2:0:/usr/include/pthread.h:261:12中包含的文件中获取此错误:注意:应为“void**”,但参数的类型为“struct threadPara**”extern int pthread_join(pthread_t_th,void**uu thread_return);^这是否意味着我必须创建一个void指针>然后接收返回值>typecast>use???@PrinceRachit?您认为应该如何解决这个问题?阅读错误消息,直到您找到答案。(是的,我在回答中犯了一个错误)是的,我改正了。我注意到你也更新了答案。谢谢