矩阵乘法使用win32线程

时间:2011-05-20 01:28:35

标签: c++ multithreading algorithm winapi matrix

我不知道我的代码有什么问题......它总是在所有元素中返回零。提示问题在哪里会很棒:)

#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;
}

3 个答案:

答案 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)

除了前面提到的其他问题之外,我在寻找时发现了一些事情:

  • 你在用什么编译?使用VC ++ 2010它会“工作”,因为它输出非零,虽然它抱怨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(这也适用于线程模型)。
  • 我会使用一些已知结果的固定值,而不是随机源矩阵。这样可以更容易地确定代码是否实际上正在计算正确的结果。