У меня есть некоторые проблемы с библиотекой потоков 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, и в настоящее время у меня нет другой ОС для тестирования кода.