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 ,这是为什么呢? 展开
 我来答
百度网友91d8d12
推荐于2017-12-16 · TA获得超过133个赞
知道答主
回答量:32
采纳率:0%
帮助的人:28.6万
展开全部

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;
所有三个线程得到的都是最后一个线程的结果。
本回答被提问者和网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式