gpt4 book ai didi

c - 为什么 pthread 返回的值与传递给线程函数的值不同?

转载 作者:太空宇宙 更新时间:2023-11-04 00:59:27 25 4
gpt4 key购买 nike

我的理解pthread_join manual我的程序是否应该输出我提供给 print_xs 的相同值,但获得的输出是:

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

有人可以解释为什么会这样吗?

最佳答案

如果你read a pthread_join reference or manual page你会看到第二个参数是一个指针指向一个指针。这是一种在 C 中模拟通过引用传递的方法。

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

解决方案是为 t3t4 使用指针:

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) 和 t4t2 相同。

关于c - 为什么 pthread 返回的值与传递给线程函数的值不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45996843/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com