我的任务是使用C编程语言(在Windows平台中)使用8
个线程对100万个随机整数进行排序。
Here's a detailed description for threads.
我在Visual Studio 2017上编写代码,这是我的进步:
// 1MRandomNumber.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include "stdio.h"
#include "stdlib.h"
#include "windows.h"
#include "time.h"
#include <tchar.h>
#include <strsafe.h>
#define MAX_THREADS 8
static int numbers[1000000];
DWORD WINAPI QuickSort(LPVOID lpParam);
//Creating a File with 1000000 random integers;
void create1MBinaryFile(){
int i, x;
FILE *fp = fopen("1MRandomNumbers.dat","wb");
srand(time(NULL));
for (i = 0; i<1000000; i++) {
x = (rand() * rand()) % 1000001;
fprintf(fp,"%d \n", x);
}
fclose(fp);
printf("File is created\n");
}
//Buffers integers to "numbers" Array;
void loadFiletoArray() {
int i = 0;
char buf[128];
FILE *fp = fopen("1MRandomNumbers.dat", "rb");
if (fp == NULL) {
fprintf(stderr, "Error in opening file");
exit(1);
}
for (int i = 0; i < 1000000 - 1; i++) {
fgets(buf, sizeof(buf), fp);
sscanf_s(buf, "%d", &numbers[i]);
}
fclose(fp);
printf("Numbers loaded to an array\n");
}
//Creates 8 Threads
void threadCreate() {
DWORD dwThreadIdArray[MAX_THREADS];
HANDLE hThreadArray[MAX_THREADS];
for (int i = 0; i<MAX_THREADS -1; i++)
{
hThreadArray[i] = CreateThread(
NULL,
0,
QuickSort,
NULL,
0,
&dwThreadIdArray[i]);
printf("Thread %d created \n", dwThreadIdArray[i]);
}
WaitForMultipleObjects(MAX_THREADS, hThreadArray, TRUE, INFINITE);
for (int i = 0; i<MAX_THREADS; i++)
{
CloseHandle(hThreadArray[i]);
}
}
int main(int argv, char *argc[])
{
create1MBinaryFile();
loadFiletoArray();
threadCreate();
return 0;
}
DWORD WINAPI QuickSort(LPVOID lpParam) {
return 0;
}
那么如何在Windows平台上创建多线程呢?在我们的讲座中,我们已经学会了在POSIX库中做到这一点,但我想学习如何通过Windows线程来实现它。
编辑:我创建了8
个帖子。这是一种真正的方法还是我应该改变它?另外,我如何为每个线程拆分数组并快速分配它们?
答案 0 :(得分:0)
代码看起来没问题,除了它创建7个线程(MAX_THREADS-1)然后等待8个线程。此外,代码应该使用lpParameter作为指向结构的指针,该结构指定要由线程排序的数组的1/8,该线程可以是一对指针(开始和结束指针)或索引。在启动线程之前,代码应该将整个文件读入数组。
要将数组拆分为8个部分,然后每个1/8大小= array_size / 8,最后1/8大于其他大小(最多7个)。如果你想要更均匀的分割,让remainder
= array_size%8。然后第一个remainder
线程的大小为(array_size / 8)+ 1,其余的大小为(array_size /) 8)。
可选 - 您可以使用线程进行合并。将线程0编号为7,然后线程6可以等待线程7退出,然后合并部分6和7.线程4可以等待线程5,合并部分4和5,然后等待线程6,并合并合并的4 ,5和6,7,依此类推。我不确定这会比单线程8路合并快得多。