linux系统下,c语言pthread多线程编程传参问题
写一个多线程计算矩阵的小程序,主要思路如下:构造一个Info的结构体,通过结构体指针将参数传给线程函数,通过显式传线程的ID来控制参数。具体程序如下#include<st...
写一个多线程计算矩阵的小程序,主要思路如下:构造一个Info的结构体,通过结构体指针将参数传给线程函数,通过显式传线程的ID来控制参数。具体程序如下#include <stdio.h>#include <stdlib.h>#include <pthread.h>int mtc[3] = { 0 }; // result matrixtypedef 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 ,这是为什么呢?
展开
1个回答
展开全部
3个线程使用的都是同一个info
代码 Info_t *info = (Info_t *)malloc(sizeof(Info_t));只创建了一个info
pthread_create(&threads[i],NULL,calMatrix,(void *)info); 三个线程使用的是同一个
我把你的代码改了下:
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
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)*3);
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[i].prank = i;
info[i].mta = mta[i];
info[i].mtb = mtb;
pthread_create(&threads[i],NULL,calMatrix,(void *)(&info[i]));
}
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;
}
矩阵的计算我忘记了,你运行看看结果对不对
追问
我想问问,为什么一个info变量不行呢 ? for循环里面不是顺序执行?在启动线程之前不是已经更新了info的信息么?
追答
pthread_create(&threads[i],NULL,calMatrix,(void *)info);
线程创建之后,子线程的执行时间由系统来决定。
你在main线程中创建了3个线程,但是3个线程使用的是同一个Info_t对象(因为传递的是同一个地址 info)
第一次创建线程 (即调用pthread_create) 后,main线程继续执行,这个时候main线程修改了Info_t对象的内容,这个时候子线程执行时通过地址info找到Info_t对象,Info_t对象已经被修改了。
根据你的程序执行的结果
主线程执行完
for(i = 0; i prank = i;
info->mta = mta[i];
info->mtb = mtb;
pthread_create(&threads[i],NULL,calMatrix,(void *)info);
}
已经跳出这个循环了,然后子线开始执行, 这个时候3个子线程得到的Info_t对象都是这样的
info->prank = 2;
info->mta = mta[2];
info->mtb = mtb;
所有三个线程得到的都是最后一个线程的结果。
本回答被提问者和网友采纳
已赞过
已踩过<
评论
收起
你对这个回答的评价是?
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询