2012-12-13 66 views
1

我有關於posix pthread的以下問題。Posix Pthread in C

  • 當我們接收由一個線程正在執行由該函數返回在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()內部接收返回的變量。

問候

回答

1

首先,你應該永遠不會做(void**)&x爲指針關閉不同類型的不一定是相同的尺寸。現在

,某些情況下(一些有效的,一些工作,但無效,有的只是打破):

美孚()返回一個指向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(無效但通常工作):
int大於指針的平臺將無法工作。

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

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

美孚()返回一個指向靜態INT(無效,永遠不會奏效): 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); 
0

你不應該這樣做:在你的ç鑄件的瞭解程度應該簡單地禁止。 如果你在一門課程中瞭解到這個質量不是很高。

首先,&x是一個指針的地址,所以結果是int**,這樣好的兩個indirections。

但是將int丟掉很危險,指向intvoid的指針在不同平臺上的寬度不一定相同。所以請不要

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

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

但是不pthread_join需要一個雙指針void變量?或者傳遞一個單獨的指針void變量是有效的 – Alfred

+0

由於什麼時候指向void的指針的寬度和指向任何其他平臺的依賴和* not *標準定義的寬度?是否有符合標準的平臺,其中碰巧是指向int的指針(或任何其他類型的指針),sizeof( *)和sizeof(void *)'是例外情況)?或者你打算反映對齊問題嗎? – WhozCraig

+0

size(void *)> = sizeof( *)是標準所說的,據我所知。但是你可能不得不在博物館裏尋找任何使用不同尺寸的平臺來查看不同的指針類型。 –