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() 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);

int を返す Foo() (無効ですが、通常は機能します):
int がポインターより大きいプラットフォームでは、これは機能しません。

void* Foo(void *arg)
{
   return 42;
}

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

pthread_join()静的 int へのポインタを返す Foo() (無効で動作しない):値をコピーする前に、Foo() が戻ると、Foo() 内のすべての静的メモリが解放されます。

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**、2つの間接参照になります。

しかし、それをint捨てるのは危険であり、異なるプラットフォームへのポインタと必ずしも同じ幅である必要はintありません。voidだからしてください

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

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