2012-11-16 121 views
0

我正在做一个家庭作业,涉及使用winthreads乘以矩阵。c中的win32线程

我是C中的新手,这是我所有的代码(我在这里读取了一些线程)。

#include <stdlib.h> 
#include <stdio.h> 
#include <time.h> 

#define M 3 
#define K 3 
#define N 3 
#define NUMBER_OF_THREADS 9 

int A[M][K] = { {1,4,3}, {2,5,4}, {3,6,1} }; 
int B[K][N] = { {8,7,6}, {5,4,3}, {7,3,1} }; 
int C[M][N]; 

clock_t start,end; 


struct v 
{ 
    int i; 
    int j; 
}; 


DWORD WINAPI MatrixMult(LPVOID Param) 
{ 
    int a; 

    DWORD sum = 0; 

    struct v *data = Param; 

    for(a = 0; a < 3; a++) 
    { 
     sum = sum + ((A[data->i][a]) * (B[a][data->j])); 
    } 

    C[data->i][data->j] = sum; 
    return 0; 

} 

int main() 
{ 
    struct v *data = malloc(sizeof(struct v)); 
    int i, j, k; 

    DWORD ThreadIds[NUMBER_OF_THREADS]; 

    HANDLE ThreadHandles[NUMBER_OF_THREADS]; 

    int thread_index = 0; 

    start = clock(); 

    for (i = 0; i < M; i++) 
    { 
     for (j = 0; j < N; j++) 
     { 
      data->i = i; 
      data->j = j; 

      ThreadHandles[thread_index] = CreateThread (NULL, 0, MatrixMult, &data, 0, &ThreadIds[thread_index]); 

      if (!ThreadHandles) 
      { 
       printf("Error, threads cannot be created"); 
       return 1; 
      } 
     } 

     thread_index++; 

    } 

    printf("Result:\n"); 

    for (i = 0; i < M; i++) 
    { 
     for (j = 0; j < N; j++) 
     { 
      printf("C[%d][%d] = %f\n", i,j, C[i][j]); 
     } 
    } 

    for (i = 0; i < 9; i++) 
    { 
     CloseHandle(ThreadHandles[i]); 
    } 

    end = clock(); 
    printf("Tiempo = %d", end - start); 

    return 0; 
} 

我有一些问题,这个程序,它编译,但它并没有运行,它标志着在阅读0x3468a3bc在0x775f15de例外,错误的错误。任何想法为什么这个错误是存在的,我该如何解决它?

+1

您是否尝试过使用调试器?学习如何使用调试器是编程中至关重要的技能。 –

+0

“为什么作业标签已被弃用并将被删除?我认为它很有用。” - 比你更聪明的人/拥有更多经验的人认为事实并非如此,这就是为什么。 – 2012-11-16 22:15:54

+0

此外,您**必须注意正确使用空格和缩进;因为它隐式地与任何数据指针类型兼容,所以不应该抛出furhtermore void *'**,并且铸造的唯一影响是降低可读性。 – 2012-11-16 22:22:09

回答

2

有(至少)三个问题:

  1. datastruct v*但它的地址已经被作为参数给线程传递(即struct v**),然后被解释为一个struct v*。这是不正确的,并且可能是错误的原因。

  2. 所有线程将在名为datastruct v的相同实例上执行。这将引入竞争条件。为每个线程分配新的struct v,并在不再需要线程时使用线程free()

  3. 类型的C[i][j]int,但printf()具有格式说明%f。这是不正确的,它应该是%d(因为它是其他参数)。

注意,它不需要投malloc()Do I cast the result of malloc?)的返回值。从公布的代码编写malloc()线的一个更常见,更好的方法是:

struct v* data = malloc(sizeof(*data)); 

记住free()什么malloc() d。

+0

嗨,谢谢你的回复=)。我发现ThreadHandles正在收回错误,当j = 2或更多时,错误显示。不知道它是否是结构的声明。 –

+0

嗨,谢谢你的回复=)。我发现ThreadHandles正在收回错误,当j = 2或更多时,错误显示。不知道它是否是结构的声明。我改变了它,就像它建议的那样,它在malloc上标记为错误,它表示无效数据不能用于初始化实体类型v。 –

+0

@BernardoOrtiz,源文件的后缀是什么?一个'void *'可以隐式地分配给C中的任何指针类型。这在C++中是不正确的。 – hmjd