2011-05-20 49 views
2

我不知道我的代码有什么问题...它总是在所有元素中返回零。一个暗示问题的地方将是伟大的:)使用win32线程的矩阵乘法

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

回答

1

有几件事情,我发现,而除了其他问题戳大约前面所提到的:

  • 您怎样编写本?使用VC++ 2010,它“工作”,因为它输出非零值,尽管它抱怨DWORD ThreadIds[num_of_thr];数组声明的数组大小非常数(我只是将num_of_thr设为常量,并将cin注释为快速测试它)。如果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(这也可以在线程模型中使用)。
  • 而不是一个随机源矩阵,我会首先使用一些固定值与已知的结果。这将更容易确定代码是否实际计算了正确的结果。
+0

感谢它为9个线程(即每个线程在一个元素上操作)的数量工作,但仍然不适用于较少的线程数。我想我应该重做初始化循环,正如你所说:)谢谢 – Loka 2011-05-20 02:25:53

2

在一个概述,你的循环中的总和声明看起来粗略。

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您可能需要一个或两个回路从取决于你想要达到的目的的分配移动的声明。

+0

是啊谢谢你..我编辑它..仍然是零:)虽然:) – Loka 2011-05-20 01:48:44

2

你是否意识到你有两个独立的变量名为a,b和c?一个是main函数的局部,另一个是整个程序的静态。我怀疑这不是你想要的。尝试删除本地主要的一个。

马丁

+0

谢谢,我编辑它。 – Loka 2011-05-20 01:41:16

+0

@Loka:你是否尝试过编辑它之后运行代码?这可能是你的问题的根源。 – ildjarn 2011-05-20 01:42:11

+0

是的,我尝试过,但仍然为零:) – Loka 2011-05-20 01:48:14