编程作业,要求使用多线程方法实现矩阵乘法。
实现起来很简单,对于结果的每个单元都使用一个子线程进行计算即可。
代码
#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



