2011-06-10 19 views
13

En this tutorial web sobre cómo enhebrar en C#, Joseph Albahari escribe: "¡No te duermas en hilos agrupados!" ¿Por qué no deberías hacer esto? ¿Qué tan gravemente puede afectar el rendimiento? (No es que quiera hacerlo, solo tengo curiosidad)Dormir en un hilo de C# agrupado

Respuesta

5

El hilo es un objeto de gran peso.
La creación de un nuevo subproceso requiere muchos recursos, como asignar 1 MB a una pila administrada, crear un objeto de subproceso administrado, pila de kernel, objeto de subproceso kernel, bloque de entorno de subproceso de usuario. Todo esto lleva tiempo y memoria. Por lo tanto, no desea crear y destruir objetos muy rápidamente. Además, una vez que tenga más de un cambio de contexto de subproceso también necesitará algunos recursos

El grupo de subprocesos es un lugar donde CLR puede poner subprocesos no utilizados, en caso de que su aplicación lo necesite.
Threadpool contiene inicialmente 0 subprocesos, una vez que solicite un subproceso de un grupo, el grupo creará rápidamente el número mínimo de subprocesos definidos para el grupo. Después de alrededor de 2 minutos, se eliminan los hilos no utilizados. Pero si la carga aumenta y necesita más subprocesos, el grupo de subprocesos creará lentamente nuevos subprocesos hasta alcanzar el límite máximo. No puede tener más hilos que el máximo, todas las solicitudes nuevas se pondrán en cola y se ejecutarán una vez que un hilo de trabajo haya regresado al grupo. En peor de los casos puede obtener OutOfMemoryException

Si un hilo tomado de una piscina es bloqueada,:

  • administra los recursos
  • no hace ningún trabajo útil, mientras que una aplicación puede necesitar este tema por una nueva solicitud
  • saltos de escalabilidad mediante la introducción de bloques
13

Solo hay un número limitado de subprocesos en el grupo de subprocesos; Los grupos de subprocesos están diseñados para ejecutar de manera eficiente una gran cantidad de tareas cortas. Confían en que cada tarea termine rápidamente, para que el hilo pueda regresar al grupo y ser utilizado para la próxima tarea.

Así que dormir en un subproceso de grupo de subprocesos priva del grupo, que eventualmente puede quedarse sin subprocesos disponibles, y no puede procesar las tareas que le asigna.

6

El grupo de subprocesos está pensado para realizar rápidamente una tarea relativamente corta en un subproceso diferente sin tener que gastar el costo de crear un nuevo subproceso. El grupo de subprocesos tiene un número máximo de subprocesos, y una vez que se alcanza, las tareas se ponen en cola hasta que un subproceso esté disponible.

Un subproceso que duerme en el grupo de subprocesos, por lo tanto, mantendrá la cola o contribuirá al agotamiento del grupo de subprocesos.

+0

Su primera línea parece estar en contradicción con el resto de lo que decir. Sin duda, mantener la cola o el agotamiento del hilo es un degradado de rendimiento directo? – Chris

+0

Quise decir que dormir en un subproceso de grupo no degradará el rendimiento de ese subproceso. Está un poco mal redactado, estoy de acuerdo. Lo he eliminado – Sven

+0

Ah, sí, entiendo a qué te refieres. No degradará el rendimiento en un subproceso, pero degradará el rendimiento de todo el proceso utilizando el grupo. Eso tiene sentido. :) – Chris