gpt4 book ai didi

c - c中的win32线程

转载 作者:行者123 更新时间:2023-11-30 14:22:52 26 4
gpt4 key购买 nike

我正在做一项作业,涉及使用 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 时出错。任何想法为什么会出现此错误以及如何修复它?

最佳答案

(至少)存在三个问题:

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

  2. 所有线程都将在 struct v 的同一个实例上执行命名data 。这将引入竞争条件。分配一个新的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.

关于c - c中的win32线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13425109/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com