16,548
社区成员




#include <Windows.h>
#include <malloc.h>
typedef struct _MyParameter
{
double *A, *B, *C;
int start, length;
}MyParameter, *PMyParameter;
DWORD multiply_thread(PVOID pv)
{
PMyParameter p = (PMyParameter)pv;
for (int i = p->start; i < p->start + p->length; ++i)
{
p->C[i] = p->A[i] * p->B[i];
}
return 0;
}
void multiply(double *A, double *B, double *C, int length)
{
SYSTEM_INFO system_info;
GetSystemInfo(&system_info);
//线程数为逻辑CPU数目2倍
int numberOfThreads = system_info.dwNumberOfProcessors * 2;
//线程句柄数组
PHANDLE handles = (PHANDLE)malloc(sizeof(HANDLE) * numberOfThreads);
if (handles == NULL)
{
return;
}
//参数数组
PMyParameter parameters = (PMyParameter)malloc(sizeof(MyParameter) * numberOfThreads);
if (parameters == NULL)
{
return;
}
//每线程计算长度
int lengthPerThread = length / numberOfThreads;
MyParameter parameter = { A,B,C,0,lengthPerThread };
//多线程计算
for (int i = 0; i < numberOfThreads; ++i)
{
parameters[i] = parameter;
parameters[i].start = i * lengthPerThread;
handles[i] = CreateThread(NULL, 0, multiply_thread, parameters + i, NULL, NULL);
}
for (int i = length / numberOfThreads * numberOfThreads; i < length; ++i)
{
C[i] = A[i] * B[i];
}
WaitForMultipleObjects(numberOfThreads, handles, TRUE, INFINITE);
free(handles);
free(parameters);
}