2009-01-27 7 views

Respuesta

32

En primer lugar yo aconsejaría leer esto: http://blogs.msdn.com/oldnewthing/archive/2007/03/01/1775759.aspx

continuación http://blogs.msdn.com/oldnewthing/archive/2005/07/29/444912.aspx

En resumen, la limitación es normalmente pila espacio (que debe estar en bloques contiguos) y desde todos los hilos consume esta dispersa sobre usted rápidamente quedarse sin bloques contiguos. En máquinas de 64 bits y sistemas operativos esto representa un problema mucho menor. Existen

Las estrategias de mitigación, pero sólo se van tan lejos (y confían en que no se utiliza mucho pila por hilo)

Como una guía general:

  • creación de decenas es casi seguro que trabajar
  • cientos es probable en el servidor actual y el hardware de escritorio, pero arriesgado
  • miles seguramente fallarán.

Es probable que no debería ser necesario crear más de diez de todos modos (y si realmente haces necesidad de que usted debe saber que esta información ya)

+0

Crearlos todos a tiempo y ponerlos en común para un uso posterior cuando la memoria no está fragmentada también debería ayudar. –

0

Supongo que no es la cantidad de hilos, sino el uso de memoria que es el factor limitante.

1

Por lo que yo entiendo todo el modelo de subprocesos que debería no ha cambiado mucho desde Win2K.

No existe un límite real de hilos en sí, sino más bien un límite del espacio de pila de procesos. Vea un in-depth explanation of threading limits de Raymond Chen para más detalles sobre esto.

+0

¡Bingo! "Pero la pregunta real que se plantea cada vez que alguien pregunta:" ¿Cuál es la cantidad máxima de hilos que un proceso puede crear? "Es" ¿Por qué estás creando tantos hilos que esto incluso se convierte en un problema? " – TheSoftwareJedi

21

La mejor respuesta que he oído cuando este tipo de preguntas es:

no importa, y si usted encuentra que sí importa, es necesario volver a pensar lo que está haciendo para que se no importa

+5

Bravo, hilos ser autodestructivo (e ineficiente) cuando hay cientos de pequeños insectores flotando alrededor. Usa un grupo de subprocesos y no tendrás que preocuparte. – paxdiablo

+1

+1 para el comentario. Me alegró el día. Y cuando se trata de enhebrar, ciertamente es cierto. –

+0

Voy a ejecutar Windows en Knights Landing. Entonces ahora importa mucho con 256-288 hilos – user1649948

12

Tenga en cuenta que debe examinar su diseño de cerca si le preocupa llegar a este límite !!!!!!!!

La respuesta a su "Pregunta más importante" de lo que sucede es OutOfMemoryException.

No es exactamente una respuesta directa, pero aquí hay un código para averiguar el límite. Sin embargo, podría estar disponible como dependiente de la memoria. Estaría interesado en ver otros resultados de OS/cpu/mem.

dude de editar y añadir la impresora en:

  • Windows 7, VS2008, de doble núcleo, mem 2gb: 1465 continuación bloqueará con OutOfMemoryException

    int i = 0; 
        try 
        { 
         while (true) 
         { 
          new Thread(new ThreadStart(() => Thread.Sleep(int.MaxValue))).Start(); 
          i++; 
         } 
        } 
        catch (Exception ex) 
        { 
         Console.WriteLine(i); 
         Console.WriteLine(ex.ToString()); 
        } 
    
+0

+1 en el sentimiento "si tienes que preguntar, entonces estás haciendo algo mal". –

+0

¿Por qué tu comunidad wiki esto? Es una buena respuesta (I + 1ed); deberías obtener crédito por ello. –

+0

Wiki de la comunidad porque no me importan las cosas de representante, y hace que sea más fácil para otros agregar sus resultados. – TheSoftwareJedi

1

LEA las Publicaciones de blog de Raymond Chen que señalaron ShuggyCoUk's answer.

Sin embargo, prestar especial atención a este bit: "¿Cuál es el número máximo de subprocesos que un proceso puede crear"

Pero la verdadera cuestión que se plantea cada vez que alguien le pregunta, es "¿Por qué estás creando tantos hilos que esto incluso se convierte en un problema?"

El modelo de "un hilo por cliente" es conocido por no escalar más allá de una docena de clientes más o menos. Si va a manejar más que muchos clientes al mismo tiempo, debe pasar a un modelo en el que, en lugar de dedicar un hilo a un cliente, en lugar de asignar un objeto. (Algún día reflexionaré sobre la dualidad entre subprocesos y objetos.) Windows proporciona puertos de finalización de E/S y un grupo de subprocesos para ayudarlo a convertir un modelo basado en subprocesos a un modelo basado en elementos de trabajo.

1

Si le pegan con un diseño existente que utiliza un alto número de hilos y las necesidades a escala, también podría considerar fibras:

http://msdn.microsoft.com/en-us/library/ms682661%28v=vs.85%29.aspx

Se le puede ahorrar un rediseño total.

Indy lo consideró para Indy 10, pero nunca sucedió porque parece que las aventuras de .NET consumen la mayor parte del tiempo.

+0

El segundo enlace de ShuggyCoUk a OldNewThing dice lo siguiente sobre fibras: * Tenga en cuenta que las fibras no ayudan mucho aquí, porque una fibra tiene una pila, y es el espacio de direcciones requerido por la pila el factor limitante casi todo el tiempo. * – foraidt

+0

El enlace de ShuggyCoUk significa que no es la solución definitiva. Lo veo más como una escala adicional de magnitud donde los hilos completos no funcionarán. Pero como se dijo, el conocimiento proviene de discusiones anticuadas en un momento en que 64 bits significaba alfa. –

0

tamaño de la pila por defecto es 1 MB y el espacio de direcciones de modo de usuario asignado al proceso de Windows en el sistema operativo Windows de 32 bits es de aproximadamente 2 GB. que permiten alrededor de 2000 hilos por proceso (2000 * 1MB = 2GB). para 64 bit, prácticamente, no hay tal problema.

Cuestiones relacionadas