实验二 线程创建

一、实验目的

了解线程的创建、执行,并观察线程并行执行的方式。

二、实验内容

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;
}

猜你喜欢

转载自blog.csdn.net/Zheng_lan/article/details/109346434