N阶矩阵相乘并线线程化
比如8阶矩阵相乘,创建2个线程,则一个线程算1-4行,另一个线程算5-8行,然后存到同一个数组里。
每次运行的结果有些行数全为0,请问是线程不安全吗?可是两个线程操作的是同一数组的不同行数,按道理是线程安全啊?
Linux系统运行,编译命令:gcc -o 文件名 文件名.c -lpthread
运行命令:./文件名 线程数
代码如下:
#include <pthread.h>
#include <sys/time.h>
#include <stdio.h>
#include <stdlib.h>
#define N 8
int a[N][N], b[N][N],c[N][N],each;
void *sum(void *vargp);
int main(int argc, char **argv)
{
pthread_t tid[N];
int i,j,begin=0, nthreads,temp[N][N];
/*Get input arguments */
if (argc != 2) {
printf("Usage: %s <nthreads>\n", argv[0]);
exit(0);
}
nthreads = atoi(argv[1]); //线程数
//生成0-100随机数、初始化矩阵a,b
srand((int)time(NULL)); //生成时间种子
for (i = 0; i<N; i++)
for (j = 0; j<N; j++)
{
a[i][j] = ((rand() % 10) + 1);
b[i][j] = ((rand() % 10) + 1);
c[i][j] = 0;
}
each = N / nthreads; //每个线程处理each行
for (i = 0; i < nthreads; i++) {
pthread_create(&tid[i], NULL, sum, (void*)&begin);
begin += each;
}
for (i = 0; i < nthreads; i++)
pthread_join(tid[i], NULL);
//输出a矩阵
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
printf("%5d", a[i][j]);
}
printf("\n");
}
printf("\n");
//输出b矩阵
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
printf("%5d", b[i][j]);
}
printf("\n");
}
printf("\n");
//输出c矩阵
for (i = 0; i < N; i++)
{
for (j = 0; j < N; j++)
{
printf("%5d", c[i][j]);
}
printf("\n");
}
exit(0);
}
void *sum(void* argp)
{
int begin = *((int*)argp);
int end = begin + each ;
int i,j,m;
for (i = begin; i < end; i++)
for (j = 0; j < N; j++)
for(m=0;m<N;m++)
{
c[i][j] += a[i][m] * b[m][j];
}
return NULL;
}