我有一个运行代码,有9个线程来操作3 * 3矩阵。我想让线程数成为用户的输入。但是我不能将矩阵除以例如4个线程。任何帮助,将不胜感激。谢谢:))
#include<iostream>
#include <stdio.h>
#include <cstdlib>
#include <ctime>
#include<windows.h>
using namespace std;
int nGlobalCount = 0;
int thread_index = 0;
int num_of_thr=9;
int a[3][3] , b[3][3] , c[3][3];
int i , j , k;
struct v {
int i; /*row*/
int j; /*column*/
};
DWORD ThreadProc (LPVOID lpdwThreadParam ) {
struct v *input = (struct v *)lpdwThreadParam ;
int avg=4*4/9;
for(int n=0; n<avg; n++) {
int sum=0;
for ( k = 0 ; k < 3; k++) {
sum=sum+((a[input->i][k])*(b[k][input->j]));
c[input->i][input->j]=sum;
if(j<3 && avg!=1)
j=j+1;
else if (j==3 && avg!=1 && (avg-n)!=1)
i=i+1;
}
}
cout<<"the number of the thread "<<thread_index<<endl;
return 0;
}
int main() {
DWORD ThreadIds[9];
HANDLE ThreadHandles[9];
struct v data[9];
for ( int i = 0 ; i < 3; i++) {
for (int j = 0 ; j < 3 ; j++) {
a[i][j] = rand() % 10;
b[i][j] = rand() % 10;
c[i][j] = 0;
}
}
for ( int i=0 ; i < 3; i++) {
for(int j=0 ; j <3; j++) {
data[thread_index].i = i;
data[thread_index].j = j;
ThreadHandles[thread_index] = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)&ThreadProc, &data[thread_index], 0,&ThreadIds[thread_index]);
thread_index++;
}
}
WaitForMultipleObjects(num_of_thr, ThreadHandles, TRUE, INFINITE);
cout<<"The matrix A is "<<endl;
for ( i = 0 ; i < 3; i++) {
for ( j = 0 ; j < 3 ; j++)
cout<<a[i][j]<<" ";
cout<<endl;
}
cout<<"The matrix B is "<<endl;
for ( i = 0 ; i < 3; i++) {
for ( j = 0 ; j < 3 ; j++)
cout<<b[i][j]<<" ";
cout<<endl;
}
cout<<"The resultant matrix is "<<endl;
for ( i = 0 ; i < 3; i++) {
for ( j = 0 ; j < 3 ; j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
for (int i=0; i<9; i++) CloseHandle(ThreadHandles[i]);
return 0;
}
答案 0 :(得分:2)
正如一些评论指出的那样,你不会在3x3矩阵上看到任何性能启动。产生新线程的成本太高了。
通常,您可以尝试线程安全的任务队列。本质上,只是一个普通的队列,在正确的位置有信号量。将仍需要计算的所有索引放入队列中。每个线程从队列的前面抓取下一个索引(将其删除),然后在从队列中获取另一个作业之前计算并填充解决方案矩阵的相应单元格。在我看来,线程安全的队列实现是相当普遍的,因此找到一个用于您的目的并不困难。
这样做的另一个好处是,您可以实时添加更多线程,或者如果您愿意,可以带走一些线程。它是一种更通用的并行化方法。
答案 1 :(得分:1)
我怀疑问题的一部分可能出在你的threadproc中的这一行:
int avg=4*4/9;
这将是1的常数,可能不是你想要的(16/9,因为int是1(提醒7))。而这反过来意味着你的外环(n)只会执行一次。