2010-06-12 9 views
6

Estoy usando Extensiones Paralelas de manera bastante fuerte y acabo de encontrar un caso donde el uso de almacenamiento local de subprocesos puede ser razonable para permitir la reutilización de objetos por subprocesos de trabajo. Como tal, estaba buscando en el atributo ThreadStatic que marca un campo/variable estático como tener un valor único por hilo.Uso de extensiones paralelas con el atributo ThreadStatic. ¿Podría perder memoria?

Me parece que no sería prudente usar PE con el atributo ThreadStatic sin ninguna garantía de reutilización de hilo por PE. Es decir, si los subprocesos se crean y se destruyen hasta cierto punto, las variables (y por lo tanto los objetos a los que apuntan) permanecen en el almacenamiento local de subprocesos durante un tiempo indeterminado, lo que provoca una pérdida de memoria. ¿O tal vez el almacenamiento de hilo está ligado a los hilos y eliminado cuando se eliminan los hilos? Pero aún tiene potencialmente hilos en una agrupación que son anhelados y que acumulan almacenamiento local de subprocesos a partir de varias piezas de código para las que se utilizan los subprocesos.

¿Existe un mejor enfoque para obtener almacenamiento local de hilo con PE?

Gracias.

+0

La terminología correcta es "retirada" en lugar de "destruida" con respecto a los hilos que se eliminan del grupo y luego arrastrando sus pilas. –

Respuesta

5

Recomiendo encarecidamente utilizar el patrón normal para el almacenamiento local de subprocesos, descrito en este MSDN article.

Cuando utiliza [ThreadStatic], lo que importa es si un subproceso de subprocesos limpia las variables TLS cuando finaliza. No hay ninguna sugerencia en los documentos de MSDN que no lo haga. No sería difícil de implementar, solo tiene que llamar a la función de API TlsFree(). Escribí una pequeña aplicación de prueba, no hay evidencia de ninguna fuga.

4

EDIT: Teniendo en cuenta la respuesta de Hans, suena como el TLS en realidad sería ser limpiado de todos modos ..., que sólo deja este bit de la respuesta:

hacer que realmente no tienen mejor manera de reutilizar los valores dentro de ¿un hilo? Si hay dos tareas que usan el mismo hilo (una completa, luego la otra ejecuta) ¿realmente van a querer el mismo valor? ¿Está en realidad simplemente usando esto como una forma de evitar la propagación de los datos de una manera más controlada a través de su tarea?

+0

El escenario es una simulación de un "mundo" basado en cuadrículas, que evalúa de forma independiente un conjunto de agentes en dicho mundo. Por lo tanto, para ejecutar en paralelo, puedo crear un nuevo mundo, usar y descartar dentro de cada ciclo paralelo. Mi intención era poner un método Reset() en el mundo para permitir su reutilización. Me imagino que el almacenamiento local estático me ayuda a no tener que administrar mi propio grupo de 'mundos' con acceso bloqueado de subprocesos asociado al grupo, etc. – redcalx

+0

@ the-locster: me temo que todavía no veo el beneficio del hilo - almacenamiento local aquí. Si está dentro de una tarea, ¿por qué no mantener la referencia? –

+0

Cada evaluación pone a un agente en un solo mundo por sí mismo. Por lo tanto, si tengo 8 núcleos/hilos de CPU, tengo 8 mundos independientes que se simulan en un momento dado: un mundo por hilo. – redcalx

Cuestiones relacionadas