¿C++ variables locales seguras multihilo?
multithreading (4)
Sé que esa pregunta puede parecer como un duplicado, pero no tengo la respuesta leyendo las otras preguntas.
Mi situación: compilador de Visual C ++ 2005 de Express Edition Studio + Windows SDK.
Solo una pregunta si una función como esa:
void myFunc()
{
int i=0;
i++;
}
¿Es seguro llamar desde múltiples hilos?
Sí, parece que lo es, pero ¿el compilador no hará que la variable i sea estática en la memoria? Entonces, ¿eso podría llevar a que dos hilos actúen juntos en una región de memoria? ¿O mis miedos son solo algunos miedos de un tonto? ¿Y todas las variables locales se crean en el momento de llamar a la función?
¿Y todas las variables locales se crean en el momento de llamar a la función?
La implementación típica de las variables locales es crearlas en la pila, y cada hilo tiene su propia pila, por lo que los locales están bien.
La única vez que debe tener cuidado es cuando la variable es un tipo complejo, ya que puede tener una lógica interna que opera con datos estáticos o globales. La mayoría de los buenos programas evitarán escribir clases como esa, por supuesto.
El compilador no puede hacer que sus variables sean estáticas, ya que eso cambia la semántica del programa. Mientras cumpla con las variables declaradas solo en su pila, puede garantizar la seguridad de subprocesos.
PeterPlexander probablemente ha respondido al caso que le preocupa, pero otro caso en el que no sería seguro es si i
fuera una variable global.
Sí, es hilo seguro.
No seré estático en la memoria, porque no es estático. Si, por otro lado, hubieras escrito:
void myFunc()
{
static int i = 0;
i++;
}
Entonces no sería seguro para subprocesos (bueno, si realmente se usara).
Las variables locales están todas ubicadas en la pila (o viven completamente en registros). Cada hilo tiene su propia pila, y los registros se manejan de tal manera que son esencialmente locales a cada hilo (ver Cambio de contexto ), por lo que está bien.