在Windows中使用线程排序1百万个整数

时间:2018-03-21 15:34:33

标签: c windows multithreading sorting

我的任务是使用C编程语言(在Windows平台中)使用8个线程对100万个随机整数进行排序。

  1. 我必须在里面创建一个包含100万随机整数的二进制文件。 (完成)
  2. 我必须将这些整数缓冲到一个数组中。 (完成)
  3. 我必须创建8个线程。 (完成)每个线程占用数组的1/8并对其进行排序(算法可以是合并或快速排序)。
  4. 然后合并所有子数组以构造完全排序的数组。
  5. 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个帖子。这是一种真正的方法还是我应该改变它?另外,我如何为每个线程拆分数组并快速分配它们?

1 个答案:

答案 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路合并快得多。