2012-07-05 19 views
6

Tengo un código en dos sistemas que ejecutan kernel 2.4.20 y kernel 2.4.38. Ambos tienen gcc 3.2.2 y glibc 2.3.2pthread_create diferencias en el núcleo de Linux 2.4.20 y 2.4.36

Bajo kernel 2.4.38, las asas pthread_t no están siendo reutilizados. En una prueba de carga pesada, la aplicación se bloquea una vez que los controladores alcanzan el 0xFFFFFFFF.

(I sospecha esto en primer lugar porque la aplicación se bloquea en las implementaciones donde utiliza un puerto de red, escáner los hilos son creados para manejar las conexiones de socket)

Este sencillo ejemplo recrea el problema:

void* ThreadProc(void* param) 
{ 
    usleep(10000); 
    printf(" Thread 0x%x\n", (unsigned int)pthread_self()); 
    usleep(10000); 
    return NULL; 
} 

int main(int argc, char* argv[]) 
{ 
    pthread_t sThread; 

    while(1) 
    { 
     pthread_create(&sThread, NULL, ThreadProc, NULL); 
     printf("Created 0x%x\n", (unsigned int)sThread); 
     pthread_join(sThread, NULL); 
    }; 

    return 0; 
} 

Bajo 2.4.20:

Created 0x40838cc0 
    Thread 0x40838cc0 
    Created 0x40838cc0 
    Thread 0x40838cc0 
    Created 0x40838cc0 
    Thread 0x40838cc0 
...and on and on... 

Bajo 04/02/36:

Created 0x4002 
    Thread 0x4002 
    Created 0x8002 
    Thread 0x8002 
    Created 0xc002 
    Thread 0xc002 
...keeps growing... 

¿Cómo puedo obtener kernel 2.4.36 para reciclar los mangos? Desafortunadamente no puedo cambiar kernel fácilmente. Gracias!

+1

¡Saludos al pasado! No creo que depender de tu programa en un comportamiento de kernel así sea una buena idea, debes arreglar tu programa. – PlasmaHH

+0

@PlasmaHH: El programa está bien; 'pthread_join' debería liberar todos los recursos de hilo. El problema es que, en esa versión particular del kernel, aparentemente no es así. –

+0

@MikeSeymour: ¿Qué te hace pensar eso? Para mí, parece que está repartiendo un identificador diferente cada vez, algo que está perfectamente bien, incluso cuando el mango anterior ha sido liberado. Al igual que a = malloc (5); libre (a); a == malloc (5); no debe ser verdad – PlasmaHH

Respuesta

4

Si sus observaciones son correctas, solo existen dos posibles soluciones.

De cualquier

  1. actualizar el kernel. Esto puede o no ser factible para usted.
  2. Recicle los hilos dentro de su aplicación.

La opción 2 es algo que puede hacer incluso si el núcleo se está portando mal. Puede mantener un grupo de subprocesos que permanecen en estado inactivo cuando no se utilizan. Los grupos de subprocesos son un patrón de ingeniería de software ampliamente conocido (consulte http://en.wikipedia.org/wiki/Thread_pool_pattern). Esta es probablemente la mejor solución para ti.

+1

Siempre hay '3. respalde una solución desde una futura versión del kernel y reconstruya su propio kernel' –

+0

@Kevin A. Naudé: Sí, probablemente tenga que implementar un grupo de subprocesos. Todavía estoy esperando que alguien sepa de una solución simple para Kernel 2.4.36. Como dije, no puedo cambiar kernel fácilmente. (incluida la construcción de la mía) – Scott

+0

@Scott: si ni siquiera puedes construir un kernel parcheado que solucione el problema, entonces no tienes ninguna esperanza de arreglar el kernel. Parece que la agrupación de subprocesos puede ser su mejor opción (tal vez única). –

0

Resulta que no estaba uniendo mis hilos correctamente en la prueba de carga.

Cuando volví a ejecutar la prueba de carga, los manejadores de subprocesos alcanzaron 0xFFFFF002, luego pasaron a 0x1002 y continuaron con éxito.

Moraleja de la historia: ¡asegúrate de que tus hilos estén unidos o separados!

Cuestiones relacionadas