2015-06-21 44 views
0

我看到不同的行爲,當變量用於獲取返回值時,使用pthread_join定義了gloabal與靜態作用域。我在這裏包含了code_snippet。pthred_exit返回變量靜態與全局作用域

靜態變量

int main() 
{ 
static int r1,r2; 
pthread_t t1, t2; 
int i1[] = {1,2}; 
int i2[] = {3,4}; 

r1 = pthread_create(&t1, NULL, myfn, (void*)i1); 
r2 = pthread_create(&t2, NULL, myfn, (void*)i2); 

pthread_join(t1, (void *)&r1); 
pthread_join(t2, (void *)&r2); 

printf("Thread 1 returns: %d\n",r1); 
printf("Thread 2 returns: %d\n",r2); 

return 0; 
} 
void *myfn(void *intarray) 
{ 
pthread_t t=pthread_self(); 
int *g = (int *) intarray; 
int i=0; 
int d=1; 

for (i=g[0];i<=g[1];i++) 
    d*=i; 
fprintf(stderr, "TID=%u %d\n",t, d); 
pthread_exit((void *)d); 
} 

返回值

TID=3425117952 12 
TID=3433510656 2 
Thread 1 returns: 2 
Thread 2 returns: 12 

全局變量

int r1,r2; 
int main() 
{ 
same as above 
} 
void *myfn(void *intarray) 
{ 
same as above 
} 

返回值

TID=3425117952 12 
TID=3433510656 2 
Thread 1 returns: 0 <<<<< it returns 0 
Thread 2 returns: 12 

可能有人請解釋爲什麼它的行爲有所不同?

回答

1

幾乎可以肯定,這是因爲intvoid *大小的平臺上有所不同,所以,當pthread_join()通過你給了它int *指針寫入void *值,它會覆蓋相鄰的存儲。

不同的聲明r1r2更改變量的佈局足以改變您看到的效果。

鑄造一個intvoid *爲了返回它是凌亂的;最好在主線程中爲結果分配空間並在啓動時將其傳遞給線程,或者讓線程分配結果並在結束時返回指向它的指針。

但是,如果你堅持在轉換爲void方法,您可以通過一個實際void *對象的地址傳遞給pthread_join,然後從鑄造修復它是int

int main() 
{ 
static int r1,r2; 
void *result; 
pthread_t t1, t2; 
int i1[] = {1,2}; 
int i2[] = {3,4}; 

r1 = pthread_create(&t1, NULL, myfn, (void*)i1); 
r2 = pthread_create(&t2, NULL, myfn, (void*)i2); 

pthread_join(t1, &result); 
r1 = (int)result; 
pthread_join(t2, &result); 
r2 = (int)result; 

printf("Thread 1 returns: %d\n",r1); 
printf("Thread 2 returns: %d\n",r2); 

return 0; 
}