【问题标题】:Posix Pthread in CC中的Posix Pthread
【发布时间】:2012-12-13 15:38:02
【问题描述】:

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

问候

【问题讨论】:

    标签: c pthreads posix


    【解决方案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() 返回指向静态 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);
    

    【讨论】:

      【解决方案2】:

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

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

      但是将 int 强制转换是危险的,指向 intvoid 的指针在不同平台上不一定具有相同的宽度。所以请做

      void*x;
      pthread_join(tid, &x);
      
      printf("%d",*(int*)x);
      

      【讨论】:

      • 但是 pthread_join 不接受双指针 void 变量吗?或者传递单个指针 void 变量是有效的
      • 从什么时候开始,指针指向 void 和指向任何东西的指针的宽度取决于平台并且由标准定义?是否有一个符合标准的平台,其中 sizeof(<type>*)sizeof(void*) 恰好是指向 int 的指针(或任何其他指针类型)的情况下是例外的?或者您是否打算反映对齐问题?
      • size(void*) >= sizeof(*) 是我记得的标准所说的。但是您可能必须在博物馆中寻找针对不同指针类型使用不同大小的任何平台。
      • @Alfred,我不确定我是否理解你的问题。如果xvoid*,那么&xvoid**
      • @JoelKlinghed,我认为标准没有预见到尺寸之间的任何关系。它唯一强制执行的是sizeof(void*)sizeof(char*) (等)是相同的,甚至它们的表示是相同的。在具有分段内存指针的体系结构上,对于不同的基本类型,可以以不同的方式实现。
      猜你喜欢
      • 1970-01-01
      • 2011-10-01
      • 1970-01-01
      • 2012-01-19
      • 2015-11-24
      • 1970-01-01
      • 2014-03-18
      • 1970-01-01
      • 2016-05-29
      相关资源
      最近更新 更多