La biblioteca estándar de C++ 11 está ampliamente hilo de seguridad. Las garantías de seguridad de subprocesos en objetos PRNG son las mismas que en los contenedores. Más específicamente, puesto que las clases PRNG son todos seudo RANDOM, es decir, que generan una secuencia determinista basada en un estado actual definido, realmente no hay habitación para ser peeking o hurgando en nada fuera del estado contenida (que también es visible para el usuario).
Del mismo modo que los contenedores necesitan cerraduras para que sean seguros para compartir, que tendría que bloquear el objeto PRNG. Esto lo haría lento y no determinista. Un objeto por hilo sería mejor.
1 Esta sección especifica los requisitos que deberán cumplir las implementaciones para evitar razas de datos (1,10). Cada función de biblioteca estándar deberá cumplir con cada requisito a menos que se especifique lo contrario. Las implementaciones pueden evitar carreras de datos en casos distintos a los especificados a continuación.
2 A C++ función de biblioteca estándar no deberá directa o indirectamente objetos de acceso (1.10) accesibles por hilos distintos de la corriente hilo a menos que los objetos se accede directamente o indirectamente a través de los argumentos de la función , incluyendo este.
3 A C función de biblioteca estándar ++ no será directa o indirectamente modificar objetos (1,10) accesible por hilos distintos de la corriente hilo a menos que los objetos se accede directamente o indirectamente a través de argumentos const no de la función , incluyendo este.
4 [Nota: Esto significa, por ejemplo, que las implementaciones no pueden utilizar un objeto estático para fines internos sin sincronización, ya que podría causar una carrera de datos incluso en programas que no comparten explícitamente objetos betweenthreads. -endnote]
5 A C función de biblioteca estándar ++ no deberá acceder a los objetos indirectamente accesibles a través de sus argumentos o por medio de elementos de su contenedor argumentos excepto invocando funciones requeridas por su especificación en aquellos elementos de contenedores.
6 Las operaciones en iteradores obtenidas al llamar a una biblioteca estándar contenedor o función miembro de cadena pueden acceder al contenedor subyacente , pero no deben modificarlo. [Nota: en particular, las operaciones del contenedor que invalidan los iteradores entran en conflicto con las operaciones en los iteradores asociados con ese contenedor. - nota final]
7 Las implementaciones pueden compartir sus propios objetos internos entre los hilos si los objetos no son visibles para los usuarios y están protegidos contra datos razas.
8 Salvo que se especifique lo contrario, las funciones de biblioteca estándar de C++ deberán realizar todas las operaciones únicamente dentro del subproceso actual si esas operaciones tienen efectos que son visibles (1.10) para los usuarios.
9 [Nota: Esto permite implementaciones para paralelizar operaciones si no hay efectos secundarios visibles. - nota final]
Eso es básicamente lo que pensé que no era seguro para subprocesos. ¿Está bien compartir el objeto de distribución 'std :: uniform_real_distribution zeroToOne (0.0, 1.0)' cantidad de subprocesos y usar un motor por subproceso? –
user1139069
@ user1139069: No, no es seguro. Aunque a primera vista un objeto de distribución * puede * hacer su trabajo simplemente delegando cada llamada al objeto del motor, sin mantener el estado interno, si lo piensa, un motor que no produce suficientes bits aleatorios podría necesitar ser llamado dos veces. Pero dos (o una) vez pueden ser excesivas, por lo que podría ser mejor permitir el almacenamiento en caché del exceso de bits aleatorios. §26.5.1.6 \t "Requisitos de distribución aleatoria de números" permite esto; Los objetos de distribución tienen específicamente un estado que cambia con cada llamada. Por lo tanto, deben tratarse como parte del motor para fines de bloqueo. – Potatoswatter