Исключение из библиотеки потоков C ++ - PullRequest
1 голос
/ 03 февраля 2020

У меня есть некоторые проблемы с библиотекой потоков C ++. Я адаптировал свой старый код для оптимизации новой проблемы, и внезапно возникает необработанное исключение (во время выполнения). Некоторые потоки успешно присоединены, но всегда есть хотя бы одно выбрасывающее исключение. Единственное, что я изменил в коде, было представление данных. Ранее они проходили в 2D-массивах, а сейчас я использую одномерные векторы. Вот точная ошибка времени выполнения, которую я получаю:

libc++abi.dylib: terminating with uncaught exception of type std::__1::system_error: thread::join failed: Invalid argument

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

Вот основной функция:

#include <iostream>
#include <thread>
#include <vector>

void reforming(const int, const std::vector<int>&, const std::vector<double>&, const std::vector<double>&);

int main() {
    int i, k;
    int spec_max = 10;
    int seg_max = 4;
    size_t pop_size = spec_max * seg_max;
    std::vector<int> seg(pop_size);
    std::vector<double> por(pop_size);
    std::vector<double> por_s(pop_size);

    for(i = 0; i < pop_size; i++){
        if(i % 2 == 0){
            seg[i] = 1;
            por[i] = 0.5;
            por_s[i] = 0.0015;
        } else {
            seg[i] = 0;
            por[i] = 0.7;
            por_s[i] = 0.002;
        }
    }

    std::vector<std::thread> Ref(spec_max);
    for(k = 0; k < spec_max; k++){
        Ref.emplace_back(reforming, k, seg, por, por_s);
    }

    for(auto &X : Ref){
        X.join();
    }
    return 0;
}

и функция «реформирования»:

#include <iostream>
#include <vector>

void reforming(const int m, const std::vector<int>& cat_check, const std::vector<double>& por,
        const std::vector<double>& por_s){

        std::cout << m << " Hello from the thread\n";
}

Я использую программное обеспечение CLion на MacOS Catalina, и в настоящее время у меня нет другой ОС для тестирования кода.

1 Ответ

4 голосов
/ 03 февраля 2020

Следующий код:

std::vector<std::thread> Ref(spec_max);
for(k = 0; k < spec_max; k++){
    Ref.emplace_back(reforming, k, seg, por, por_s);
}

создает 2 * spec_max потоки, первые spec_max потоки инициализируются по умолчанию. При попытке присоединиться к инициализированному по умолчанию потоку выдается std::system_error.

Исправление:

std::vector<std::thread> Ref;
Ref.reserve(spec_max);
for(k = 0; k < spec_max; k++){
    Ref.emplace_back(reforming, k, seg, por, por_s);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...