Teniendo en cuenta que:std :: string en un programa multi-hilo
1) El estándar de C++ 03 no se refiere a la existencia de hilos de ninguna manera
2) El estándar de C++ 03 deja a las implementaciones de decidir si std::string
debe utilizar la semántica Copy-on-Write en su constructor copia
3) Copy-on-Write semántica a menudo conducen a un comportamiento impredecible en un programa multi-hilo
I llegar a lo siguiente, aparentemente controvertido al, conclusión:
Simplemente no se puede utilizar con seguridad y de forma portátil std :: string en un programa multi-hilo
Obviamente, hay una estructura de datos STL es seguro para subprocesos. Pero al menos, con std :: vector, por ejemplo, puede simplemente usar mutexes para proteger el acceso al vector. Con una implementación de std :: string que utiliza COW, ni siquiera se puede hacer de manera confiable sin editar la semántica de recuento de referencias en profundidad dentro de la implementación del proveedor.
ejemplo del mundo real:
En mi empresa, tenemos una aplicación multi-hilo que ha sido minuciosamente la unidad a prueba y ejecución de Valgrind innumerables veces. La aplicación se ejecutó durante meses sin problemas de ningún tipo. Un día, recompilo la aplicación en otra versión de gcc, y de repente obtengo segfaults al azar todo el tiempo. Valgrind ahora informa sobre accesos de memoria no válidos en profundidad dentro de libstdC++, en el constructor de copia std :: string.
¿Cuál es la solución? Bueno, por supuesto, podría typedef std::vector<char>
como una clase de cadena, pero en realidad, eso es una mierda. También podría esperar C++ 0x, y pido que los implementadores renuncien a COW. O, (estremecimiento), podría usar una clase de cuerda personalizada. Personalmente siempre enfurezco a los desarrolladores que implementan sus propias clases cuando una biblioteca preexistente funciona bien, pero, sinceramente, necesito una clase de cadena de caracteres que estoy seguro de que no está utilizando la semántica de COW; y std :: string simplemente no garantiza eso.
¿Estoy en lo cierto que std::string
simplemente no se puede utilizar de manera confiable en absoluto en programas portátiles, de múltiples hilos? ¿Y cuál es una buena solución?
ver http://stackoverflow.com/questions/1594803/is-stdstring-thead-safe-with-gcc-4-3 – sellibitze
Guau, ni siquiera sabía que la implementación de la cadena VACA todavía está por ahí. – sbi
Si su implementación de STL utiliza un código no seguro para subprocesos, debe reemplazarlo por uno mejor. Esto parece un error para mí. – rpg