Estoy desarrollando un programa multihilo se ejecuta en Linux (compilado con G ++ 4.3) y si se busca por un poco encontrar una gran cantidad de historias de miedo sobre std :: string no ser seguro para subprocesos con GCC. Supuestamente, esto se debe al hecho de que internamente utiliza copia en escritura que causa estragos en herramientas como Helgrind.¿Está std :: string thead-safe con gcc 4.3?
He hecho un pequeño programa que copia una cadena a otra cadena y si se inspecciona las dos cadenas que ambos comparten el mismo puntero interno _M_p. Cuando se modifica una cadena, el puntero cambia, por lo que las cosas de copiar y escribir funcionan bien.
Lo que me preocupa, aunque es lo que sucede si comparto una cadena entre dos hilos (por ejemplo, pasando como un objeto en un coladatos multi-hilo entre dos hilos). Ya he intentado compilar con la opción '-pthread', pero eso no parece hacer mucha diferencia. Entonces mi pregunta:
- ¿Hay alguna manera de forzar que std :: string sea seguro para la rosca? No me importaría si el comportamiento de copiado en escritura se deshabilitó para lograr esto.
- ¿Cómo lo han resuelto otras personas? ¿O estoy siendo paranoico?
Me parece que no puede encontrar una respuesta definitiva, así que espero que ustedes me puede ayudar ..
Editar:
Wow, eso es un montón de respuestas en un corto tales hora. ¡Gracias! Definitivamente usaré la solución de Jack cuando quiera desactivar COW. Pero ahora la pregunta principal es: ¿realmente tengo que deshabilitar COW? ¿O es la 'contabilidad' hecha para el hilo VACA seguro? Actualmente estoy a navegar por las fuentes de libstdC++, pero eso va a tomar bastante tiempo para averiguar ...
Editar 2
OK navegado el código fuente libstdC++ y me parece algo como esto en libstd ++ - v3 /include/bits/basic_string.h:
_CharT*
_M_refcopy() throw()
{
#ifndef _GLIBCXX_FULLY_DYNAMIC_STRING
if (__builtin_expect(this != &_S_empty_rep(), false))
#endif
__gnu_cxx::__atomic_add_dispatch(&this->_M_refcount, 1);
return _M_refdata();
} // XXX MT
Así que definitivamente hay algo ahí acerca de los cambios atómicos al contador de referencia ...
Conclusión
Estoy marcando el comentario de sellibitze como respuesta aquí porque creo que hemos llegado a la conclusión de que esta área aún no está resuelta por el momento. Para eludir el comportamiento de COW, sugeriría la respuesta de Jack Lloyd. ¡Gracias a todos por una discusión interesante!
+1 buena pregunta! Desafortunadamente, las personas solo leen "threadsafe" y piensan "¡No!". ¡Ellos mejor leen toda la pregunta! :) – sellibitze
Como std :: string es una instancia de la plantilla std :: basic_string, es posible que eche un vistazo al código fuente. Intente buscar cualquier macro que active/desactive la seguridad de los hilos. –
Por cierto, copiar-en-escribir es lento en entornos de subprocesos múltiples, debe * querer * no usarlo, no estar dispuesto a hacerlo. – GManNickG