Параллельная сортировка слиянием с использованием _beginthreadex windows API в C++

Я пытаюсь реализовать сортировку слиянием, используя Win32 _beginthreadex несколько потоков в C++. в основном он использует _beginthreadex вместо вызова функции для создания рекурсии в каждом потоке. поэтому он будет иметь как можно больше потоков. цикл while после двух вызовов _beginthreadex должен проверить, завершают ли дочерние потоки свою работу. Но когда программа обращается к массиву a и b, выдает ошибку, из-за которой невозможно прочитать память, я не могу найти, в чем проблема. Похоже, что в разделе сортировки в дочерних потоках программа пытается получить доступ к недопустимому адресу памяти, по которому info->b переходит на адрес 0xcccccccc {???}. Спасибо

#include "stdafx.h"
#include <windows.h>
#include <iostream>
#include <process.h>
#include <stdlib.h>
#include <time.h>
#include <string>
#include <sstream>
#include <array>
#include <stdio.h>

using namespace std;


struct ThreadInfo
{
    int* a;
    int* b;
    int low;
    int high;
    bool run;
};





unsigned __stdcall mergesort(void* x) {

ThreadInfo* info = (ThreadInfo*)x;

if ((info->low) < (info->high))
{
    int pivot = ((info->low)+(info->high))/2;
    ThreadInfo lowInfo;
    ThreadInfo highInfo;
    lowInfo.a=info->a;
    lowInfo.low=info->low;
    lowInfo.high=pivot;
    lowInfo.run=true;
    highInfo.b=info->b;
    highInfo.low=pivot+1;
    highInfo.high=info->high;
    highInfo.run=true;
    //HANDLE myhandlerUp, myhandlerDown;


    //creat sub-thread
    _beginthreadex(NULL, 0, mergesort, &lowInfo, 0, 0);
    //WaitForSingleObject(myhandlerUp,INFINITE);
    _beginthreadex(NULL, 0, mergesort, &highInfo, 0, 0);
    //WaitForSingleObject(myhandlerDown,INFINITE);
    //check if any child threads are working 



    bool anyRun = true;
    while (anyRun)
    {
        anyRun = false;
        anyRun = lowInfo.run || highInfo.run;

    }

    //doing merge sort
    int h,i,j,k,low, high;
    low = info->low;
    high = info->high;
    h=low;
    i=low;
    j=pivot+1;
    while((h<=pivot)&&(j<=high))
     {

         if(info->a[h]<=info->a[j])
         {
             info->b[i]=info->a[h];
             h++;
         }
         else
         {
             info->b[i]=info->a[j];
             j++;
          }
          i++;
     }


    if(h>pivot)
    {
        for(k=j; k<=high; k++)
        {
            info->b[i]=info->a[k];
            i++;
        }
     }


    else
    {
        for(k=h; k<=pivot; k++)
           {
               info->b[i]=info->a[k];
               i++;
           }
    }

        for(k=low; k<=high; k++) info->a[k]=info->b[k];

    }


    info->run = false;
    return 0;

}

void main()
{

ThreadInfo info;
int inputArr[12] = {12,10,43,23,-78,45,123,56,98,41,90,24};


int copiedArr[12]={0,0,0,0,0,0,0,0,0,0,0,0};
info.a=inputArr;
info.b=copiedArr;

for(int i=0; i<12; i++)
cout<<info.a[i]<<" ";
cout<<endl;


info.low=0;
info.high=(11);
info.run=true;
_beginthreadex(NULL, 0, mergesort, &info, 0, 0);



bool finish = info.run;
while(finish){
    cout<<"Running...."<<endl;
    Sleep(1000);
}



cout<<"After run the result is "<<endl;
for(int i=0; i<12; i++)
    cout<<inputArr[i]<<" ";
cout<<endl;

getchar();

}

0 ответов

Другие вопросы по тегам