Posix Pthread in C

时间:2012-12-13 15:38:02

标签: c pthreads posix

我对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()如何在内部接收返回的变量。

此致

2 个答案:

答案 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转换为危险,指向intvoid的指针在不同平台上的宽度不一定相同。所以请做

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

printf("%d",*(int*)x);