variable thread method c++ multithreading static member-functions

c++ - thread - Funciones miembro estáticas y seguridad de subprocesos.



thread bind c++ (4)

Los objetos y las variables creadas en una función miembro estática no se consideran ''locales'' como lo harían en una función miembro, por lo que ahora se pueden compartir entre varios subprocesos, ¿no?

Mientras que si tienes una función miembro que crea algún objeto, esto sería local al hilo y, por lo tanto, no está compartido.

¿Estoy en lo correcto al decir esto?


Considera esta clase

class CData { public: static void func() { int a; static int b; } int c; static int d; }; int main() { CData::func(); }

Ahora la variable a es local para cada llamada de func() . Si dos subprocesos llaman func() al mismo tiempo, obtienen versiones diferentes de a .

b es un local estático. El valor persiste entre las diferentes llamadas de func() . Si dos subprocesos llaman a func() al mismo tiempo, acceden a la misma versión de b por lo que es posible que tengan que hacer la sincronización.

c es una variable de instancia; se adjunta a una instanciación particular de CData. func() no puede acceder a c , excepto con un truco que mostraré a continuación.

d es una variable estática. Hay una instancia de d compartida entre todos los usos de la clase CData, por lo que la sincronización puede ser necesaria. Se puede usar fácilmente desde la función estática func() .

El truco utilizado para acceder a los datos de instancia desde una función estática es pasar un objeto válido a la función.

p.ej

class CData { public: static void func(CData *p) { int a; static int b; b = p->c; } int c; static int d; }; int main() { CData data; CData::func(&data); }

Espero que ayude.


No importa si una función es estática o no (método de clase). Solo las variables automáticas pueden verse como locales a una función. Si tiene la dirección de esos datos, puede acceder a ella.

Puede utilizar, por ejemplo , el almacenamiento local de subprocesos para asignar su salida a un contexto de subproceso dedicado.


No, no estás en lo correcto. Y sí, C ++ hace un uso excesivo de la palabra "estática".

Una variable miembro de clase estática es, por supuesto, una global con la clase actuando como un ámbito de espacio de nombres y con algunas diferencias de privilegios de acceso si es privada o está protegida (la clase solo puede acceder a ella).

Sin embargo, una función miembro de clase estática es como una función libre regular (no miembro de clase) y tiene sus propias variables locales cada vez que se llama.

La única diferencia real entre una función miembro de clase estática y una función libre regular, aparte de su convención de nomenclatura, es que tiene acceso a miembros privados de una clase (y necesita una "instancia" externa de uno).

Además, se puede llamar a una función miembro de clase estática desde una plantilla con un parámetro de plantilla variable, invocando lo que comúnmente se denomina "polimorfismo de tiempo de compilación" y se usa comúnmente en la metaprogramación.

Una variable "local" estática en cualquier función es una instancia única, por otro lado, también es un poco como una global y es sensible a los problemas de contención de hilos, ya que dos subprocesos que llaman a la función acceden a la misma instancia.


No, no estás en lo correcto.

Los objetos creados en una función estática no se comparten, y este es también el caso de cualquier función normal.

Sin embargo, los objetos se pueden compartir si se declaran estáticos y no depende de si la función es estática o no.

void myFunc() { static MyObject o; o.CallMethod(); // here o is shared by all threads calling myFunc }

Cuando un objeto se declara estático, es como si el objeto fuera una variable global, pero solo visible en el ámbito de la función en la que se declara.