我在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];
}
}
答案 0 :(得分:2)
你的问题源于这一行:
int newArray[maxCount + 1];
您正在尝试在堆栈上分配~250000 int
(在大多数32位平台上,它将占用〜1MB
内存。您的线程堆栈可能无法执行此操作。
顺便说一下,你不应该这样做 - 在运行时创建已知大小的数组应该通过堆内存分配来完成:
int* newArray = (int*)malloc(sizeof(int) * (maxCount + 1));
并在函数结束时:
free(newArray);
然而,最好的解决方案是使用std::vector: