Стандартная библиотека C ++ 11 является многопоточной. Гарантии безопасности потока на объектах PRNG такие же, как на контейнерах. Более конкретно, поскольку все классы PRNG являются псевдо -лучайными, то есть они генерируют детерминированную последовательность, основанную на определенном текущем состоянии, на самом деле нет места, чтобы заглядывать или тыкать во что-либо за пределами содержащегося состояния (которое также виден пользователю).
Точно так же, как контейнеры нуждаются в блокировках, чтобы сделать их безопасными для совместного использования, вам придется заблокировать объект PRNG. Это сделало бы это медленным и недетерминированным. Один объект на поток был бы лучше.
1 В этом разделе указываются требования, которым должны соответствовать реализации
чтобы предотвратить гонки данных (1.10). Каждая стандартная библиотечная функция должна
соответствовать каждому требованию, если не указано иное. Реализации могут
предотвратить гонки данных в случаях, отличных от указанных ниже.
2 Стандартная библиотечная функция C ++ не должна прямо или косвенно
доступ к объектам (1.10), доступным для потоков, отличных от текущего
поток, если объекты не доступны прямо или косвенно через
аргументы функции, включая эту.
3 Функция стандартной библиотеки C ++ не должна прямо или косвенно
изменить объекты (1.10), доступные для потоков, отличных от текущего
поток, если объекты не доступны прямо или косвенно через
неконстантные аргументы функции, включая эту.
4 [Примечание: это означает, например, что реализации не могут использовать
статический объект для внутренних целей без синхронизации, потому что он
может вызвать гонку данных даже в программах, которые явно не разделяют
объекты между нитями. -endnote]
5 Функция стандартной библиотеки C ++ не должна обращаться к объектам косвенно
доступны через его аргументы или через элементы его контейнера
аргументы за исключением вызова функций, требуемых его спецификацией
на этих элементах контейнера.
6 Операции над итераторами, получаемые путем вызова стандартной библиотеки
функция-член контейнера или строки может обращаться к
контейнер, но не должен изменять его. [Примечание: в частности, контейнер
операции, которые делают недействительными итераторы конфликтуют с операциями на
итераторы, связанные с этим контейнером. - конец примечания]
7 Реализации могут совместно использовать свои внутренние объекты между потоками
если объекты не видны пользователям и защищены от данных
расы.
8 Если не указано иное, стандартные функции библиотеки C ++ должны
выполнять все операции исключительно внутри текущего потока, если те
Операции имеют видимые для пользователей эффекты (1.10).
9 [Примечание: это позволяет реализациям распараллеливать операции, если
нет никаких видимых побочных эффектов. - конец примечания]