在线程中运行递归合并排序方法时发生EXC_BAD_ACCESS错误

时间:2015-06-15 23:35:18

标签: c++ multithreading sorting recursion

我在xCode中遇到了我的C ++代码问题。我试过调试,我无法解决它。我知道这大概是我的mergeSort()方法调用我的mergeNumbers()方法。我知道这不是方法本身,因为我没有线程运行方法,它工作得很好。当我尝试在线程中使用它时,我遇到了问题。

我尝试在线查找,我能找到的最接近我的问题的是,我的方法调用已被删除或不再存在的对象可能是个问题。我将不胜感激任何反馈。谢谢。

#include <cstdlib>
#include <pthread.h>
#include <stdio.h>
#include <fstream>
#include <iostream>
#include <string>


using namespace std;
void openFile();
void* mergeSort(void *threadid);
void mergeNumbers(int *myArray, int minCount, int maxCount, int midCount);
void mergeSort(int *myArray, int minCount, int maxCount);
void trial2();

int array1[500000];
int array2[500000];
int array3[250000];
int array4[250000];
int array5[250000];
int array6[250000];


int main(int argc, char *argv[]) {

    openFile();
    //trial1();
    trial2();
    return 0; 
}

void trial2(){
    int i, t1;
    void *status;
    pthread_t thread1, thread2, thread3, thread4;
    t1 = pthread_create(&thread1, NULL, mergeSort, (void *)i);
    pthread_join(thread1, &status);
}

void* mergeSort(void *threadid){
    long tid = (long)threadid;
    cout << "I am performing the Merge Sort" << endl;
    mergeSort(array6, 0, 249999);
    pthread_exit(NULL);
}

void mergeSort(int *myArray, int minCount, int maxCount)
{
    int midCount;
    if (minCount < maxCount)
    {
        midCount=(minCount+maxCount)/2;
        mergeSort(myArray,minCount,midCount);
        mergeSort(myArray,midCount + 1,maxCount);

        mergeNumbers(myArray, minCount, maxCount, midCount);
    }
    return;
}

void mergeNumbers(int *myArray, int minCount, int maxCount, int midCount)
{
    int newArray[maxCount + 1];
    int arrayNum = minCount;
    int num1 = minCount;
    int num2 = midCount + 1;


    while (num1 <= midCount && num2 <= maxCount)
    {
        if (myArray[num1] < myArray[num2])
        {
            newArray[arrayNum] = myArray[num1];
            num1++;
            arrayNum++;
        }
        else
        {
            newArray[arrayNum] = myArray[num2];
            num2++;
            arrayNum++;
        }
    }

    while (num1 <= midCount)
    {
        newArray[arrayNum] = myArray[num1];
        num1++;
        arrayNum++;
    }

    while (num2 <= maxCount)
    {
        newArray[arrayNum] = myArray[num2];
        num2++;
        arrayNum++;
    }

    for (num1 = minCount; num1 < arrayNum; num1++)
    {
        myArray[num1] = newArray[num1];
    }
}

1 个答案:

答案 0 :(得分:2)

你的问题源于这一行:

int newArray[maxCount + 1];

您正在尝试在堆栈上分配~250000 int(在大多数32位平台上,它将占用〜1MB内存。您的线程堆栈可能无法执行此操作。

顺便说一下,你不应该这样做 - 在运行时创建已知大小的数组应该通过堆内存分配来完成:

int* newArray = (int*)malloc(sizeof(int) * (maxCount + 1));

并在函数结束时:

free(newArray);

然而,最好的解决方案是使用std::vector