0

当用于使用 pthread_join 获取返回值的变量被定义为全局与静态范围时,我看到了不同的行为。我在这里包含了 code_snippet。

静态变量

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

有人可以解释为什么它的行为不同吗?

4

1 回答 1

1

几乎可以肯定这是因为你的平台的大小intvoid *不同,所以当通过你给它的指针pthread_join()写入一个void *值时,它会覆盖相邻的内存。int *

不同的声明r1r2改变变量的布局足以改变你看到的效果。

为了返回它而铸造一个intto是混乱的;void *您最好在主线程中为结果分配空间并在它启动时将其传递给线程,或者让线程分配结果并在完成时返回指向它的指针。

但是,如果您坚持强制转换为 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;
}
于 2015-06-21T09:56:18.323 回答