问题
第一题,第二问一个4m×4m的方阵与一个4×1的列向量相乘,要求开4个线程运算。矩阵用随机数填充。
代码
四个线程要访问的数据没有重合,不需要加锁,加锁反而就不是并行处理了。
线程初始化后,要等待四个线程都运行结束,计算才全部结束。
#include <iostream>
#include <thread>
#include <mutex>
#include <random>
using namespace std;
constexpr auto m = 150;
int A[m * 4][ m * 4];
int x[m * 4];
int b[m * 4];
void cal(int i) {
cout << i << "线程正在运行" << endl;
for (int p = i*m; p < (i+1) * m; p++) {
b[p] = 0;
for (int q = 0; q < 4 * m; q++) {
b[p] += A[p][q] * x[q];
}
}
cout << i << "线程运行结束" << endl;
}
int main()
{
for (int i = 0; i < 4 * m; i++) {
for (int j = 0; j < 4 * m; j++) {
A[i][j] = rand() % 21 - 10;
}
x[i]= rand() % 21 - 10;
}
thread ts[4];
for(int i=0;i<4;i++){
ts[i]=thread(cal,i);
}
for(int i=0;i<4;i++){
ts[i].join();
}
cout << "部分矩阵如下" << endl << "A=" << endl;
for (int i = 0; i < 10; i++) {
for (int j = 0; j < 10; j++) {
cout << A[i][j] << " ";
}
cout << endl;
}
cout << "x=" << endl;
for (int i = 0; i < 10; i++) {
cout << x[i] << endl;
}
cout << "b=" << endl;
for (int i = 0; i < 10; i++) {
cout << b[i] << endl;
}
}