C 中的 Win32 线程



我正在做一项涉及使用 winthread 乘以矩阵的功课。

我是 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] = %fn", 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错误。任何想法为什么会出现此错误以及如何解决它?

(至少)有三个问题:

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

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

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

请注意,不需要强制转换 malloc() 的返回值(我是否强制转换 malloc 的结果?从发布的代码编写malloc()行的更常见和更好的方法是:

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

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

最新更新