2015-06-21 88 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; 
}