0

私はwinthreadsを使用して行列を乗算することを含む宿題をしています。

私は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;
}

このプログラムに問題があり、コンパイルされますが、実行されません。0x775f15de例外でエラー、0x3468a3bcの読み取りでエラーが発生します。このエラーが存在する理由と、それを修正するにはどうすればよいですか?

4

1 に答える 1

2

(少なくとも)3つの問題があります:

  1. dataはですが、struct v*そのアドレスは引数としてスレッド(つまり、struct v**)に渡され、スレッドは。として解釈されますstruct v*。これは正しくなく、エラーの考えられる原因です。

  2. すべてのスレッドは、struct vnamedの同じインスタンスで実行されますdata。これにより、競合状態が発生します。struct vスレッドごとに新しいものを割り当て、free()不要になったときにスレッドを作成します。

  3. のタイプはC[i][j]ですintprintf()、フォーマット指定子があります%f。これは正しくありません%d。(他の引数の場合と同様に)そうあるべきです。

malloc()mallocの結果をキャストしますか? )の戻り値をキャストする必要はないことに注意してください。malloc()投稿されたコードから行を書くためのより一般的でより良い方法は次のとおりです。

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

dとfree()は何かを覚えておいてください。malloc()

于 2012-11-16T22:12:02.783 に答える