Ограничено ли std :: random_device количеством экземпляров на g ++? - PullRequest
0 голосов
/ 20 сентября 2018

Этот кодовый блок

  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 vector.

rngThread - это вектор mt19937.

distThread - это вектор однородных вещественных распределений.

Все работают нормально менее чем за 2000элементы, в многопоточной части, но эта ошибка есть только в этом блоке инициализации.

  • g ++ (Ubuntu 5.4.1-2ubuntu1 ~ 16.04) 5.4.1
  • Оптимизация O3 включена
  • -m64 -mtune = включены общие параметры компиляции
...