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
}
矩阵的计算我忘记了,你运行看看结果对不对
进程内的线程会共享进程的资源,包括文件句柄
pthread_create的实现
pthread_create是基于clone实现的, 创建出来的其实是进程, 但这些进程与父进程共享很多东西, 共享的东西都不用复制给子进程, 从而节省很多开销, 因此,这些子进程也叫轻量级进程(light-weight process)
不能,看看 pthread_create(handle ,0, pfunc, arg )就只有一个arg,但arg是一个void*类型的,可以将一个结构体传入,那个结构体可以有不定个变量,从而实现你说的将两个参数传递进去
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)