pthred_exit return 变量静态与全局范围
pthred_exit return variable static vs global scope
当使用 pthread_join 获取 return 值的变量被定义为全局范围与静态范围时,我看到了不同的行为。我在这里包含了 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);
}
Return值
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
}
Return值
TID=3425117952 12
TID=3433510656 2
Thread 1 returns: 0 <<<<< it returns 0
Thread 2 returns: 12
有人可以解释为什么它的行为不同吗?
几乎可以肯定是因为 int
和 void *
的大小在您的平台上不同,所以当 pthread_join()
通过 int *
写入一个 void *
值时你给它的指针,它会覆盖相邻的内存。
r1
和 r2
的不同声明改变了变量的布局足以改变你看到的效果。
将 int
转换为 void *
以便 return 它是混乱的;您最好在主线程中为结果分配 space 并在线程启动时将其传递给线程,或者让线程分配结果并在完成时 return 指向它的指针。
但是,如果您坚持强制转换为 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;
}
当使用 pthread_join 获取 return 值的变量被定义为全局范围与静态范围时,我看到了不同的行为。我在这里包含了 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);
}
Return值
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
}
Return值
TID=3425117952 12
TID=3433510656 2
Thread 1 returns: 0 <<<<< it returns 0
Thread 2 returns: 12
有人可以解释为什么它的行为不同吗?
几乎可以肯定是因为 int
和 void *
的大小在您的平台上不同,所以当 pthread_join()
通过 int *
写入一个 void *
值时你给它的指针,它会覆盖相邻的内存。
r1
和 r2
的不同声明改变了变量的布局足以改变你看到的效果。
将 int
转换为 void *
以便 return 它是混乱的;您最好在主线程中为结果分配 space 并在线程启动时将其传递给线程,或者让线程分配结果并在完成时 return 指向它的指针。
但是,如果您坚持强制转换为 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;
}