2011-03-03 17 views
9

En mis hilos, siempre declarar variables locales "normalmente", por lo tanto:¿Cuál es la diferencia entre un threadvar y una variable local

procedure TMyThread.Execute ; 

var 
    i : integer ; 

begin 
i := 2 ; 

etc, Si yo los declaro así:

procedure TMyThread.Execute ; 

threadvar 
    j : integer ; 

begin 
j := 2 ; 

¿Cómo se modifican la ejecución/generación de código/velocidad/seguridad de hilos?

+0

nunca he visto un threadvar declarada dentro de una función. ¿Eso incluso compila? – CodesInChaos

+0

bueno, ahí tienes. – rossmcm

Respuesta

17

Bueno, para empezar, el código con threadvar es una sintaxis no válida. Un threadvar necesita tener alcance de unidad en vez de alcance local.

variable local

Cada invocación (incluso de diferentes hilos y llamadas reentrantes) de una función da lugar a diferentes instancias de las variables locales de esa función.

de rosca variable local

Un hilo variable local tiene instancias separadas para cada hilo en el proceso. Hay una correspondencia de uno a uno entre las instancias de la variable y los hilos.

Discusión

Si el procedimiento no es re-entrante, y es el único procedimiento que se refiere a la variable entonces no habrá ninguna diferencia semántica entre una variable local y una threadvar - pero si un local de variable se puede utilizar, entonces debería ser.

En términos de rendimiento, el threadvar es más lento que una variable local y puede que ni siquiera funcione en el contexto de una DLL.

Mi recomendación es usar una variable local siempre que sea posible. Use un threadvar (o Thread Local Storage (TLS) cuando esté en una DLL) si necesita una variable de alcance global que tenga una sola instancia por subproceso. Sin embargo, tal necesidad es rara y tiene la desventaja severa de que las variables locales de subprocesos tienen muchos de los mismos inconvenientes que las verdaderas variables globales.

+0

Aha - gracias @David por el puntero de sintaxis. Estoy un poco confuso sobre cuál debería ser la sintaxis. Supongo que me referiría a J como SomeThread.j, pero ¿en qué parte del hilo lo declaro? Todavía no puedo ver el uso de ellos, sin embargo. – rossmcm

+2

@ross No los use si no es necesario. Las variables locales asignadas de pila son el Santo Grial. Si puedes hacer todo tu trabajo con variables de stack, ¡entonces estás dorado! –

+0

@David No puedo pensar en un lugar donde los usaría – rossmcm

2

Al usar la palabra clave ThreadVar, a cada subproceso se le da una instancia separada de cada variable, lo que evita conflictos de datos y preserva la independencia del subproceso.

Además, no es necesario que proteja sus variables threadvar en secciones críticas, ya que son locales a la secuencia.

mejores deseos,
Radu

+0

pero seguramente las variables locales ordinarias declaradas dentro del método Execute están separadas de otras variables locales en otros subprocesos también. – rossmcm

+0

@ross sí, los lugareños siempre son mejores si trabajan semánticamente. Además, están separados de las llamadas de reentrada a Execute, en caso de que eso ocurra. –

Cuestiones relacionadas