1

我有以下关于 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()接收返回的变量。

问候

4

2 回答 2

1

首先,您永远不应该这样做(void**)&x,因为不同类型的指针不必具有相同的大小。

现在,一些场景(一些有效,一些有效但无效,一些刚刚损坏):

Foo() 返回指向 an 的指针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() 返回指向静态 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);
于 2012-12-13T15:57:43.333 回答
0

您不应该这样做:在您对 C 转换的理解水平上,应该简单地禁止。如果您在课程中学到了这一点,那么这并不是真正的高质量。

首先,&x是一个指针的地址,所以结果是int**,那么好两个间接。

但是将其int丢弃是危险的,指向int并且void在不同平台上不一定具有相同的宽度。所以请做

void*x;
pthread_join(tid, &x);

printf("%d",*(int*)x);
于 2012-12-13T15:53:45.847 回答