2012-11-16 3 views
0

나는 winthreads를 사용하여 행렬을 곱하는 것을 포함하는 숙제를하고 있습니다.win32 threads in c

저는 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

"숙제 태그가 사용되지 않고 삭제 될 이유가 무엇입니까? 유용하다고 생각합니다." - 당신보다 더 똑똑한 사람/경험이 많은 사람은 그렇지 않다고 생각합니다. –

+0

또한 공백과 들여 쓰기를 올바르게 사용해야합니다 **. furhtermore'void *'**는 모든 데이터 포인터 유형과 암시 적으로 호환되므로 캐스트하지 않아야합니다. 그리고 캐스팅의 유일한 효과는 가독성을 떨어 뜨리는 것입니다. –

답변

2

이 세 가지 문제 (적어도)가 있습니다

  1. datastruct v*이지만,이 주소는 스레드 인수로 전달되는입니다 (즉, struct v**) 다음 struct v*으로 해석되고있다. 이는 잘못된 것이며 오류의 가능한 원인 일 수 있습니다.

  2. 모든 스레드는 struct vdata이라는 동일한 인스턴스에서 실행됩니다. 경쟁 조건이 도입 될 것입니다. 각 스레드에 대해 새로 struct v을 할당하고 스레드가 더 이상 필요하지 않을 때 free()이되도록하십시오.

  3. C[i][j]의 종류가 있지만 intprintf()는 형식 지정 %f있다. 이것은 틀리며 %d이어야합니다 (다른 인수와 동일하므로). 이 malloc() (Do I cast the result of malloc?)의 반환 값을 캐스팅 할 필요가 없습니다 것을

참고. 게시 된 코드에서 malloc() 라인을 작성하는 더 일반적이고 더 좋은 방법은 다음과 같습니다

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

malloc() D 무엇 free()에 기억

.

+0

안녕하십니까, 응답 =). ThreadHandles가 j = 2 이상일 때 오류가 표시 될 때 오류가 발생한다는 것을 발견했습니다. 그것이 struct의 선언인지 궁금합니다. –

+0

안녕하세요, 응답 주셔서 감사합니다 =). ThreadHandles가 j = 2 이상일 때 오류가 표시 될 때 오류가 발생한다는 것을 발견했습니다. 그것이 struct의 선언인지 궁금합니다. 그것을 제안하고 그것을 malloc 오류를 표시하는 것처럼 바뀌 었습니다, void 데이터가 엔티티 형식 v를 초기화하는 데 사용할 수 없습니다. –

+0

@BernardoOrtiz, 원본 파일의 접미사는 무엇입니까? 'void *'는 C에서 모든 포인터 타입에 암묵적으로 할당 될 수 있습니다.이것은 C++에서는 사실이 아닙니다. – hmjd