我对posix的pthread有以下问题。
当我们收到由线程执行的函数返回的pthread_join()
中的数据时,我们输入类似(void **)
的变量,即使该变量是单个指针。
int *x;
pthread_join(tid,(void**)&x);
printf("%d",*x);
我应该拒绝类型转换参数(如果是结构)?为什么我不喜欢
struct Data *obj= & (struct Data*)arg;
?
int main()
{
...
pthread_create(tid,NULL,Foo,&obj);
...
}
void *Foo(void *arg)
{
struct Data *obj=* (struct Data*)arg;
}
pthread_join()
如何在内部接收返回的变量。
此致
答案 0 :(得分:1)
首先,你永远不应该(void**)&x
,因为不同类型的指针不需要具有相同的大小。
现在,有些情况(一些有效,一些有效但有些无效):
Foo()返回指向int (valid)
的指针:
void* Foo(void *arg)
{
int *ret = malloc(sizeof(int));
*ret = 42;
return ret;
}
void *ptr;
int *x;
pthread_join(thread, &ptr);
x = ptr;
printf("%d", *x);
free(x);
Foo()返回一个int(无效但通常是工作):
int大于指针的平台不起作用。
void* Foo(void *arg)
{
return 42;
}
void *ptr;
int x;
pthread_join(thread, &ptr);
printf("%d", (int)ptr);
Foo()返回指向static int的指针(无效且永不工作):
当Foo()返回时,Foo()中的所有静态内存都被释放,pthread_join()
可以复制该值。
void* Foo(void *arg)
{
int ret = 42;
return &ret;
}
void *ptr;
int *x;
pthread_join(thread, &ptr);
x = ptr;
printf("%d", *x);
答案 1 :(得分:0)
你不应该这样做:在你对C演员的理解水平上应该被禁止。 如果你在课程中学到了这一点,那就不是很高质量了。
首先,&x
是指针的地址,因此结果为int**
,因此有两个间接。
但是将int
转换为危险,指向int
和void
的指针在不同平台上的宽度不一定相同。所以请做
void*x;
pthread_join(tid, &x);
printf("%d",*(int*)x);