многопоточность, ошибка thread 2: exc_bad_access

210
26 ноября 2016, 19:10

Изучаю многопоточность в С++. Сделал простую программку на создание и вывод двумерного массива. Если массив больше 50х50 элементов то должен работать поток если меньше то работать должно без потоков. Но при работе с потоком программа выдает ошибку которая видна на скрине. Подскажите пожалуйста что не так.

#include <iostream>
#include <cstdlib>
#include <thread>
using namespace std;
void arrayBig(int rowLength, int columnsLength)
{
    int i, j;
    int arr[1000][1000];
    for (i = 0; i <= rowLength - 1; i++)
    {
        for (j = 0; j <= columnsLength - 1; j++)
        {
            arr[i][j] = rand() % 10;
        }
    }
    for (i = 0; i <= rowLength - 1; i++)
    {
        for (j = 0; j <= columnsLength - 1; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
}
int arrayLitle(int rowLength, int columnsLength)
{
    int i, j;
    int arr[1000][1000];
    for (i = 0; i <= rowLength - 1; i++)
    {
        for (j = 0; j <= columnsLength - 1; j++)
        {
            arr[i][j] = rand() % 10;
        }
    }
    for (i = 0; i <= rowLength - 1; i++)
    {
        for (j = 0; j <= columnsLength - 1; j++)
        {
            cout << arr[i][j] << " ";
        }
        cout << endl;
    }
    return arr[i][j];
}
int main()
{
    int columnsLength = 0, rowLength = 0;
    cout << "Укажите длину массива!\n";
    cout << "Введите размер ряда: ";
    cin >> rowLength;
    cout << "Введите размер столбцов: ";
    cin >> columnsLength;
    if ((rowLength >= 50) || (columnsLength >= 50))
    {
        cout << "Работают потоки!"  << endl;
        std::thread aB(arrayBig, rowLength, columnsLength);
        if (aB.joinable())
            aB.join();
    }
    else
    {
        cout << "Справимся без потоков!!!" << endl;
        arrayLitle(rowLength, columnsLength)
    }
    system("pause");
    return 0;
}
Answer 1

Ну, я бы не назвал это многопоточностью... Вы просто делаете то же, что в основном потоке, в другом. Ну да ладно...

Но у вас для

int arr[1000][1000];

требуется, грубо говоря, 4 мегабайта стека. Не многовато ли? попробуйте выделять эту память динамически, или потренируйтесь на массиве, скажем, 100 на 100...

READ ALSO
Случаи указания типа данных в условии цикла

Случаи указания типа данных в условии цикла

Добрый вечерПришел с вопросом

162
Как заменить StretchDIBits на BitBlt

Как заменить StretchDIBits на BitBlt

Здравствуйте! Использую такую функцию:

326
Покажите, как создать DLL со строками на C++

Покажите, как создать DLL со строками на C++

Пробовала разные варианты создания на выходе файла DLL, который содержит несколько строк, поскольку изучаю C# - C++ непонятен совсем

206