写一个多线程计算矩阵的小程序,主要思路如下:
构造一个Info的结构体,通过结构体指针将参数传给线程函数,通过显式传线程的ID来控制参数。
具体程序如下
#include
#include
#include
int mtc[3] = { 0 }; // result matrix
typedef struct
{
int prank;
int *mta;
int *mtb;
}Info_t;
void* calMatrix(void* arg)
{
int i;
Info_t *info = (Info_t *)arg;
int prank = info->prank;
fprintf(stdout,"calMatrix : prank is %d\n",prank);
for(i = 0; i < 3; i++)
mtc[prank] += info->mta[i] * info->mtb[i];
return NULL;
}
int main(int argc,char **argv)
{
int i,j,k = 0;
int mta[3][3];
int mtb[3] = { 1 };
Info_t *info = (Info_t *)malloc(sizeof(Info_t));
for(i = 0; i < 3; i++)
for(j = 0; j < 3; j++)
mta[i][j] = k++;
/* 3 threads */
pthread_t *threads = (pthread_t *)malloc(sizeof(pthread_t)*3);
fprintf(stdout,"\n");fflush(stdout);
for(i = 0; i < 3; i++)
{
info->prank = i;
info->mta = mta[i];
info->mtb = mtb;
pthread_create(&threads[i],NULL,calMatrix,(void *)info);
}
for(i = 0; i < 3; i++)
pthread_join(threads[i],NULL);
fprintf(stdout,"\n==== the matrix result ====\n\n");
fflush(stdout);
for(i = 0; i < 3; i++)
{
fprintf(stdout,"mtc[%d] = %d\n",i,mtc[i]);
fflush(stdout);
}
return 0;
}
利用gcc编译 gcc calMatrix.c -o test -lpthread
执行 test ./test
但是得到的结果是
在线程函数里面,prank并没有是预期的0,1,2 ,而全部是2 ,这是为什么呢?