我不知道我的代码有什么问题......它总是在所有元素中返回零。提示问题在哪里会很棒:)
#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=5;
int a[4][4], b[4][4], c[4][4];
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/num_of_thr;
int count=0;
for(int i = 0; i <= 3 ; i++) {
for(int j = 0; j <= 3; j++) {
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;
count++;
}
}
}
//Print Thread Number
//printf ("Thread #: %d\n", *((int*)lpdwThreadParam));
//Reduce the count
return 0;
}
int main() {
// int x=0;
cout<<"enter no of threads : ";
cin>>num_of_thr;
DWORD ThreadIds[num_of_thr];
HANDLE ThreadHandles[num_of_thr];
//struct v {
// int i; /*row*/
// int j; /*column*/
//};
struct v data[num_of_thr];
int i , j , k;
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 < num_of_thr/2; i++) {
for(int j = 0; j < num_of_thr/2; 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 resultant matrix is "<<endl;
for ( i = 0 ; i < 4; i++) {
for ( j = 0 ; j < 4 ; j++)
cout<<c[i][j]<<" ";
cout<<endl;
}
for (int i=0; i<num_of_thr; i++)
CloseHandle(ThreadHandles[i]);
return 0;
}
答案 0 :(得分:2)
在GLANCE中,循环中的和声明看起来很粗略。
for(int i = 0; i <= 3 ; i++) {
for(int j = 0; j <= 3; j++) {
for ( k = 0 ; k <= 3; k++)
{
int sum=sum+((a[input->i][k])*(b[k][input->j])); // this declaration seems wrong
c[input->i][input->j]=sum;
count++;
}
}
}
每个内部循环你重新声明总和,有效地使它成为0.你可能想要根据你想要实现的目标将声明从作业中移出一到两个循环。
答案 1 :(得分:2)
你是否意识到你有两组独立的变量名为a,b和c?一个是函数main的本地,另一个是整个程序的静态。我怀疑这不是你想要的。尝试删除main的本地文件。
马丁
答案 2 :(得分:1)
除了前面提到的其他问题之外,我在寻找时发现了一些事情:
DWORD ThreadIds[num_of_thr];
数组声明具有非常量数组大小(我只是使num_of_thr
成为常量并注释掉cin
快速测试。cin >> num_of_thr;
输入有效数量的线程吗?例如,如果num_of_thr
为0,则可以解释零输出。这里cout
的简单num_of_thr
非常有用。for(int i = 0; i < num_of_thr/2; i++) {
开头的数据初始化循环中,您没有正确计算将导致数组下溢或溢出的线程。例如,如果num_of_thr
为5,则num_of_thr/2
为2,这导致仅初始化元素0..3,使最后一个元素保持未初始化。虽然稍后的CloseHandle()
调用在尝试释放基本上随机的句柄时失败,但数组下溢在技术上是可以的。如果您输入更多线程,您将溢出所有阵列(例如,尝试使用num_of_thr=10
)。ThreadProc()
函数,而不是从线程内调用。使用调试器跟踪程序或将日志输出到stdout / file(这也适用于线程模型)。