2011-06-12 19 views
15

Sé que esa pregunta puede parecer un duplicado, pero no tengo la respuesta para leer las otras preguntas.C++ variables locales seguras multiproceso?

Mi situación - compilador Visual C++ 2005 del estudio de la edición express + SDK de Windows.

Sólo una pregunta si una función así:

void myFunc() 
{ 
    int i=0; 
    i++; 
} 

es seguro para llamar desde varios subprocesos?

Sí, parece que lo es, pero no será el compilador crea 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 temores de un tonto? Y todas las variables locales se crean en el momento de llamar a la función?

Respuesta

23

Sí, es seguro para subprocesos.

i no habrá estática en la memoria, porque no es estática. Si, por el contrario, le había escrito:

void myFunc() 
{ 
    static int i = 0; 
    i++; 
} 

Entonces no sería seguro para subprocesos (bueno, si se utilizó en realidad i).

Las variables locales están ubicados en la pila (o viven en su totalidad en los registros). Cada hilo tiene su propia pila, y los registros se manejan de tal manera que son esencialmente locales para cada hilo (ver Context Switching), así que estás bien.

+0

¡Gracias, Peter Alexander! – Evengard

5

El compilador no puede hacer que sus variables estáticas, ya que eso cambia la semántica del programa. Siempre que se adhiera a las variables declaradas solo en su pila, entonces puede garantizar la seguridad de las hebras.

1

@PeterAlexander probablemente ha respondido al caso que le preocupa, pero otro caso en el que no sería seguro es si i era una variable global.

7

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 subproceso tiene su propia pila, por lo que los locales están bien.

La única vez que usted tiene que mirar hacia fuera es cuando la variable es un tipo complejo, porque puede tener lógica dentro de ella que opera exclusivamente en datos estáticos o datos globales. La mayoría del buen software evitará escribir clases así, por supuesto.

Cuestiones relacionadas