我是多线程编程的新手。在这里,我编写了一个小程序来计算从0到20的平方根。我的thread_id数组的大小是3.我的策略就像要求thread_ID [0]计算0,3,6的平方根...和thread_ID [ 1]计算1,4,7 ... 但结果似乎有一些问题。有重复的结果。
#include <stdio.h>
#include <math.h>
#include <pthread.h>
#define THREAD_NUM 3
void *thread_function( void *arg )
{
int *incoming = (int*)(arg);
double result = sqrt(*incoming);
printf("The square root of %d is %f\n ",*incoming, result);
return NULL;
}
int main( void )
{
pthread_t thread_ID[THREAD_NUM];
void *exit_result;
int i;
for( i = 0; i < 20; i++ )
{
int id = i%THREAD_NUM;
int num = i;
if( i >= THREAD_NUM )
{
if(pthread_join( thread_ID[id], &exit_result ) != 0)
perror("join failed");
}
if( pthread_create( &thread_ID[id],NULL,thread_function,&(num)) != 0)
perror("create failed");
}
for( i = 0; i < THREAD_NUM; i++ )
{
pthread_join( thread_ID[i], &exit_result );
}
return 0;
}
结果是
2的平方根是1.414214 3的平方根是1.732051 2的平方根是1.414214 4的平方根是2.000000 5的平方根是2.236068 7的平方根是2.645751 8的平方根是2.828427 6的平方根是2.449490 9的平方根是3.000000 10的平方根是3.162278 12的平方根是3.464102 13的平方根是3.605551 11的平方根是3.316625 14的平方根是3.741657 15的平方根是3.872983 16的平方根是4.000000 18的平方根是4.242641 17的平方根是4.123106 19的平方根是4.358899 19的平方根为4.358899
答案 0 :(得分:1)
你的所有线程只有一个整数。具体做法是:
int num = i;
致电时
pthread_create( &thread_ID[id],NULL,thread_function,&(num))
然后将num
的地址传递给线程。现在在每个创建的线程中,您使用以下地址:
int *incoming = (int*)(arg);
因此,*incoming
将成为主函数中num
的指针。问题是,它将成为每个其他线程正在使用的相同 num
的指针。并且您不断更改num
的值。因此,每个线程都将查看您为其设置的最后一个值。