Ошибка сегментации при использовании потоков в функции с большими массивами -C++

Я впервые использую потоки и сталкиваюсь со странной ошибкой сегментации всякий раз, когда вызываемая функция принимает очень большие массивы.

#include <iostream>       
#include <thread>
#include <cmath>

const int dimension = 100000; // Dimension of the array
// Create a simple function of an array
void absolut(double *vec) { 
    double res = 0.; 
    for (int i = 0; i < dimension; i++) { 
        res += vec[i] * vec[i];
    }
    std::cout << std::sqrt(res) << std::endl;
}

int main() {
    // Define arrays
    double p[dimension], v[dimension]; 
    for (int i = 1; i < dimension; i++) { 
        p[i] = 1./double(i);
        v[i] = 1./double(i)/double(i);
    }
    // use multithreading
    std::thread t1(absolut, p);
    std::thread t2(absolut, v); 

    t1.join(); 
    t2.join();

    return 0;
}

Программа работает нормально, но если я увеличу dimension массивов в 10 раз, я получу ошибку сегментации. Кто-нибудь знает, почему это происходит и как это исправить?

2 * 100000 * 8 байт помещаются в общий стек, в 10 раз меньше. Разместите их в куче, например, используйте для них std::vector или new.
mch 17.03.2022 15:20

размер стека ограничен. Темы здесь не очень актуальны

463035818_is_not_a_number 17.03.2022 15:21

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

molbdnilo 17.03.2022 15:23
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
3
56
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий
double p* = new double[dimension];
double v* = new double[dimension];

Я думаю, что это компилируется из-за ограничений размера, определенных компилятором, возможно, с использованием динамического распределения.

Спасибо, вместо этого я использовал std::vector, но, видимо, все, что находится в куче, в порядке.

tomtom1-4 17.03.2022 15:51

@tomtom1-4 -- Давай с std::vector. Использование new[]/delete[] больше не рекомендуется, если у вас нет для этого веских причин.

PaulMcKenzie 17.03.2022 15:56

Код OP также компилируется. И это также может привести к сбою во время выполнения (хотя гораздо менее вероятно)

463035818_is_not_a_number 18.03.2022 13:06

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