2010-12-22 10 views
10

En C++, cuando tiene variables locales en una función de miembro estático, ¿significa que esas variables locales también son implícitamente estáticas o son realmente locales?función de miembro estático y seguridad de subprocesos

ejemplo:

static void myClass::somefunc(int someint) 
{ 

int myint = someint; // is myint really a local variable or does it change due to the static qualifier at function level? 


} 

Además, los diferentes hilos de un grupo de subprocesos de ejecutar esta función, necesita ser protegido por una cerradura Myint? asumiendo que todos los valores pasados ​​a él son diferentes y no tienen relación entre sí.

EDIT: Gracias por las respuestas. Ahora, ¿qué pasa si pasé en un boost::shared_ptr<T>, sabiendo que este objeto no sería utilizado simultáneamente por otro hilo? (No estoy seguro si realmente se puede garantizar eso, ¿o no?)

Supongo que un ptr sin procesar entró, necesitaría protección, si se usara de nuevo.

+1

Usted está confundido por tener dos significados completamente diferentes estáticas. No estás solo, lo cual es quizás la razón por la cual la función estática en una función independiente ya no está disponible. – Suma

Respuesta

8

Son locales a menos que los declare static - cada invocación de la función tendrá su propia copia de la variable y no necesita protegerlos.

+6

@ T33C: ¿Dónde tiene un local "estático" que me pregunto? – sharptooth

+1

Algunas personas parecen confundir 'funciones estáticas' con' variables locales estáticas', mientras que prácticamente no hay relación entre las dos. –

+1

@ T33C: Estás equivocado. La variable obviamente no es estática (incluso si la función es). Elimine su -1 –

1

myint es local para somefunc y no necesita protegerlo entre subprocesos.

1

myint en su ejemplo es una variable local, cada vez que somefunc se llama myint lives. pero no más que eso.

Myint no necesita ser protegido porque es una variable local

1

myint será verdaderamente local. No tienes que preocuparte por protegerlo. Se creará un espacio separado en la pila para myint por cada llamada de función en la memoria.

1

La variable myint se mantendrá local, no hay necesidad de protegerlos ya que cada subproceso no compartirá las variables locales.

1

La palabra clave estática significa que la función no tendrá un argumento " oculto". Además, la función no tendrá acceso a los datos de instancia de la clase. El calificador estático de la función no tiene ningún impacto en los datos locales de la función.

El static RetType SomeClass::SomeMethod(Type arg) tiene el mismo "tipo" como una función gratuita RetType SomeFunc(Type arg)

Saludos,
Marcin

Cuestiones relacionadas