Soy consciente del hecho de que los contenedores de la biblioteca estándar no son seguros para subprocesos. Por eso solía pensar que un contenedor, digamos de tipo std::list
, no puede accederse por más de un hilo al mismo tiempo (algunos de los cuales pueden modificar el contenedor). Pero ahora parece que hay más de lo que parece; algo más sutil, algo no tan obvio, al menos para mí.contenedores estándar como variables locales en la aplicación de subprocesos múltiples
Por ejemplo, considere esta función que acepta el primer argumento por valor :
void log(std::string msg, severity s, /*...*/)
{
return; //no code!
}
¿Este thread-safe?
Al principio, parece que es seguro para subprocesos, ya que el cuerpo de la función no tiene acceso a recursos modificables, por lo tanto, seguro para subprocesos. Pensándolo bien, se trata de mí que al invocar una función de este tipo, un objeto de tipo std::string
será creado, que es el primer argumento, y creo que la construcción de este objeto no es hilo de seguridad, ya que utiliza internamente std::allocator
, que creo que no es seguro para subprocesos. Por lo tanto, invocar dicha función tampoco es seguro para subprocesos. Pero si es correcto, ¿qué pasa con esto:
void f()
{
std::string msg = "message"; //is it thread-safe? it doesn't seem so!
}
¿Estoy yendo bien? ¿Podemos usar std::string
(o cualquier contenedor que usa std::allocator
internamente) en un programa de subprocesos múltiples?
Estoy hablando específicamente acerca de los contenedores como variables locales, a diferencia de los objetos compartidos.
busqué Google y encontró muchas dudas similares, sin respuesta concreta. Me enfrento a un problema similar al suyo:
Por favor considere C++ y C++ 03 11, ambos.
Nawaz - ¿sabes qué implementación de C++ están hablando aquí: http://www.sgi.com/tech/stl/Allocators.html Indica que el asignador predeterminado es seguro para la rosca. – Sid
@Sid: no es una biblioteca estándar; admiten muchas cosas que stdlib no tiene. – Nawaz
Bien, perdón por la distracción. – Sid