EXC_BAD_ACCESS线程中运行递归合并排序方法时出错

EXC_BAD_ACCESS error occurring when running recursive merge sort method in a thread

本文关键字:排序 合并 方法 出错 递归 运行 BAD ACCESS 线程 EXC      更新时间:2023-10-16

我在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];
    }
}

您的问题源于这一行:

int newArray[maxCount + 1];

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

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

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

在函数的末尾:

free(newArray);

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