一、实验目的
了解线程的创建、执行,并观察线程并行执行的方式。
二、实验内容
1 设计线程数据结构
1.1用结构体标记每个矩阵的每个节点的位置,并设计routine函数计算每个节点的值,以便后期进行矩阵相乘运算。
1.2 根据输入的参数设计a、b、c矩阵的大小并为其分配空间。
1.3输入a、b矩阵的值,以供运算。
1.4 创建多线程,每个节点的计算都分配了一个线程来计算。计算得到结果c矩阵。
1.5 每个子线程计算结果结束前,主线程必须要等待子进程计算完成,然后再将结果输出。然而一般情况下主线程会很快结束,因此这里使用pthread_join来使主线程等待子线程执行完才结束。
1.6 回收分配的空间资源
2.在主线程中创建多个线程,观察线程的执行。
三、实验要求
Linux 下多线程编程完成矩阵乘法,从而提高效率。
四、源代码
#include <iostream>
#include <pthread.h>
#include<stdio.h>
#include<stdlib.h>
using namespace std;
//定义结构体用来标记矩阵的节点
struct Point{
int x;
int y;
};
//定义指针用来指向矩阵a,b,c
int **a;
int **b;
int **c;
//a,b矩阵的大小
int asize_x;
int asize_y;
int bsize_x;
int bsize_y;
//计算节点值的函数
void* routine (void* point)
{
int x = ((Point *)point)->x;
int y = ((Point *)point)->y;
c[x][y] = 0;
for(int i = 0; i < asize_y; i++)
c[x][y] += a[x][i] * b[i][y];
return point;
}
int main()
{
int i = 0;
int j = 0;
int k = 0;
//输入矩阵a的大小
cout << "input first Matrix size:";
cin >> asize_x >> asize_y;
//矩阵b的大小
cout << "input second Matrix size:";
cin >> bsize_x >> bsize_y;
if(asize_y != bsize_x)
{
cout << "wrong input!\n";
return 0;
}
//给矩阵分配空间资源
a = new int *[asize_x];
for(i = 0; i < asize_x; i++)
{
a[i] = new int [asize_y];
}
b = new int *[bsize_x];
for( i = 0; i < bsize_x; i++)
{
b[i] = new int [bsize_y];
}
c = new int *[asize_x];
for( i = 0; i < asize_x; i++)
{
c[i] = new int [bsize_y];
}
//输入矩阵的值
cout << "input first Matrix:";
for( i = 0;i < asize_x; i++)
{
for( j = 0; j < asize_y; j++)
{
cin >> a[i][j];
}
}
cout << "input second Matrix:";
for( i = 0;i < bsize_x; i++)
{
for( j = 0; j < bsize_y; j++)
{
cin >> b[i][j];
}
}
cout<<"创建子线程前:"<<endl;
system("ps -af");
//从主线程中拷贝出子线程
pthread_t *thread = new pthread_t[asize_x * bsize_y];
for(i = 0; i < asize_x; i++)
{
for(j = 0; j < bsize_y; j++)
{
Point *point = new Point();
point->x = i;
point->y = j;
if(pthread_create(&thread[k++], NULL, routine, point))
{
cout << "create thread fail!\n";
return 0;
}
cout<<"创建子线程:"<<endl;
system("ps -af");
}
}
//在子线程执行完成之前主线程必须要等待
for(i = 0; i < asize_x * bsize_y; i++)
{
pthread_join(thread[i],NULL);
}
for (i = 0; i < asize_x; i++)
{
for(j = 0; j < bsize_y; j++)
{
cout << c[i][j] << " ";
}
cout << endl;
}
cout << endl;
//回收之前分配的空间资源
for(i=0; i < asize_x; i++)
{
delete a[i];
delete c[i];
}
for(i=0; i < bsize_x; i++)
{
delete b[i];
}
delete b;
delete c;
delete a;
return 0;
}