Этот кодовый блок
try
{
for(int i=0;i<N;i++)
{
std::shared_ptr<std::random_device> tmp=std::shared_ptr<std::random_device>(new std::random_device);
rdThread.push_back(tmp);
rngThread.push_back(std::mt19937((*rdThread[rdThread.size()-1])()));
distThread.push_back(std::uniform_real_distribution<T>(0,1));
}
}
catch(std::exception & ex)
{
std::cout<<ex.what()<<std::endl;
}
выдает исключение, когда N равно 2000 или аналогичному высокому значению. Сообщение об ошибке исключения во время выполнения:
random_device::random_device(const std::string&)
Segmentation fault (core dumped)
Я не могу найти, если ошибка о некоторой std :: string, которую использует random_device, или о внутреннем ограничении gcc для этого генератора чисел. Но push_back в vector или разыменование в следующем push_back, похоже, каким-то образом его используют.
Возможно ли, что компилятор может не поддерживать несколько тысяч генераторов случайных чисел?
rdThread
является вектором (shared_ptr) random_device.
rngThread
является вектором mt19937.
distThread
вектор равномерных вещественных распределений.
Все работают нормально для менее чем 2000 элементов, в многопоточной части, но эта ошибка только в этом блоке инициализации.
Задача ещё не решена.
Других решений пока нет …