栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Windows C++多线程练习——矩阵乘法

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Windows C++多线程练习——矩阵乘法

编程作业,要求使用多线程方法实现矩阵乘法。
实现起来很简单,对于结果的每个单元都使用一个子线程进行计算即可。


代码
#include 
#include 
#include 
using namespace std;

// 使用多线程实现矩阵相乘 

#define NAME_LINE 40
#define SIZE 20*20
int Ax,Ay,Bx,By;
int matrix_A[100][100], matrix_B[100][100];
int result[100][100];

typedef struct __param
{
	int _x;
	int _y;
	int _n;
	int _pno;
}PARAM;

void readInput(){
	fstream fin;
	fin.open("input.txt",ios::in);
	if(fin.is_open())cout<<"打开成功"<	cout<<"打开失败"<>Ax>>Ay>>Bx>>By;
	for(int i=0;i
		for(int j=0;j
			fin>>matrix_A[i][j];
		}
	}
	for(int i=0;i
		for(int j=0;j
			fin>>matrix_B[i][j];
		}
	}
	fin.close();
}

HANDLE mutex = NULL; // 互斥量 

//  线程函数
DWORD WINAPI ThreadProc(LPVOID argv){
	PARAM* pData = (PARAM*)argv; 	
	for (int i = 0; i < pData->_n; ++i){
		result[pData->_x][pData->_y] += matrix_A[pData->_x][i]*matrix_B[i][pData->_y];	
	}
	// 请求获得一个互斥量锁
	WaitForSingleObject(mutex, INFINITE); 
	cout<< pData->_pno<< "---"<_x<<"-"<_y<<"-"<< result[pData->_x][pData->_y] << endl;
	ReleaseMutex(mutex);
	return 0L;
} 
 
int main(){
	readInput();
	// 创建一个互斥量 
	mutex = CreateMutex(NULL, FALSE, NULL);
	 
	// 初始化线程数据
	PARAM param[SIZE];
	for(int i=0;i
		for(int j=0;j
			param[i*By+j]._n = Ay;
			param[i*By+j]._x = i;
			param[i*By+j]._y = j;
			param[i*By+j]._pno = i*By+j;
		}
	}
	// 创建线程
	HANDLE thread[SIZE];
	for(int i=0;i
		for(int j=0;j
			thread[i*By+j] = CreateThread(NULL, 0, ThreadProc, ¶m[i*By+j], 0, NULL);	
		}
	}
	WaitForMultipleObjects(Ax*By, thread, TRUE, INFINITE);
	return 0;
} 

如何实现多线程

通过使用Windows API 提供的CreateThread函数可以创建一个线程。
thread[i * By + j] = CreateThread(NULL, 0, ThreadProc, ¶m[i * By + j], 0, NULL);
我的理解是,线程运行时会回调创建该线程时所传入的ThreadProc函数,并且线程所需要的数据可以用结构体的形式传递给线程。
WaitForMultipleObjects(Ax * By, thread, TRUE, INFINITE);
因为只有当所有线程运行完毕,才能获得最终的计算结果,所以在主线程需要添加WaitForMultipleObjects函数。如果不加的话,主线程会抢在子线程执行完之前结束,导致子线程的结果无法输出。


多线程技术的特点
  • 多线程因为其并发性,要比单线程效率更高,能更有效的提高系统资源的利用率和系统的吞吐量。单线程下计算矩阵相乘,时间复杂度很高;而使用多线程技术,即使在数据量较大的情况下依然能取得不错的效率。
  • 对于不同数据的操作采用了统一的回调函数,达到了简化编程的作用。为了实现矩阵乘法,创建了大量的子线程,但这些子线程的回调函数完全相同,通过传入的参数来区分不同的子线程,实现计算。
  • 同一进程中的不同线程之间的独立性低,因为他们共享进程的内存地址空间和资源,线程的之间的通信和合作容易实现。就矩阵乘法来说,子线程各自的内部处理、计算结果相互独立,但使用的都是从文件中读取的矩阵数据,共同完成了计算任务。

参考教程
https://www.runoob.com/w3cnote/cpp-multithread-demo.html
https://blog.csdn.net/u014311306/article/details/80074397

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/853212.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号