En C++ 11 los hilos estándar ahora son una parte admitida del lenguaje. La norma indica explícitamente que las llamadas setlocale() introducen carreras de datos con otras llamadas a setlocale() o llamadas a funciones que se ven afectadas por la configuración regional C actual, incluido strtod(). Se considera que la función locale :: global() se comporta como si llamara a setlocale(), por lo que también puede introducir una carrera de datos (se indica a continuación).
En Linux con glibc es MT-unsafe (const:locale env) que los hilos llaman a setlocale() simultáneamente con un argumento no NULO y llaman a cualquier otra función que pueda usar la configuración regional global (raza de datos y comportamiento indefinido en C11). Se sugiere utilizar uselocale() en su lugar, que es seguro para MT y cambia solo la configuración regional del hilo llamante. En Linux con libstdC++ en código C++, debe evitar locale :: global (cambio en todo el proceso) y crear una configuración regional para el uso del subproceso (la configuración regional :: global es MT insegura por las mismas razones que el tiempo de ejecución de C). Dado su objetivo de usar strtod (una C API) debe usar uselocale().
En Linux utilizando glibc, la función setlocale() en sí misma no es segura para MT a menos que cumpla 2 criterios estrictos, y según lo requiera POSIX, cambia la configuración regional para todo el proceso. Las nuevas páginas man de Linux (parte de Red Hat and Fujitsu work to specify MT-safety notations for all APIs) marcan setlocale() como "MT-Unsafe const: locale env", lo que significa que setlocale es MT-safe IFF mantiene la configuración regional constante (no modificándola, simplemente consultándola pasando NULL), y si mantiene constante la configuración regional y el entorno (para evitar cambios en la configuración regional si el argumento es ""). En Linux con glibc debe usar uselocale() si desea cambiar solo la configuración regional de la secuencia de llamada, ya que es seguro para MT y no depende de su entorno de ninguna manera y strtod utilizará la configuración regional del subproceso. De forma similar, todos los sistemas que implementan POSIX deben proporcionar uselocale() para usar en un contexto de subprocesos (MT-safe).
OS X implementa uselocale() para que pueda usar eso.
En Windows, use _configthreadlocale para cambiar si setlocale() opera en todo el proceso o subprocesos (lo convierte en uselocale que es lo que necesita), pero para el código C++ debe volver a use an instance of the locale class and avoid locale::global.
a got it, gracias – milo
Las últimas actualizaciones de proyectos de manual de linux contienen información de seguridad de MT. Desplácese hacia abajo de la página a "ATRIBUTOS" para ver "MT inseguro const: locale env" que define la seguridad de la función. Este marcado fue parte de una colaboración de un año entre el proyecto linux man-pages y glibc para desarrollar dicho marcado para uso del desarrollador. Luego 'man 7 attributes' para ver cómo puedes trabajar con const: locale y env markup para intentar ponerlo a salvo. –