2011-09-12 3 views
0

J'essayais un programme simple en ce qui concerne la synchronisation des threads en utilisant pthreads sur un système Linux. La source de mon programme peut être trouvée au http://pastebin.com/5EWS68NL.Synchronisation des threads - Nombre maximum de threads pour un processus

Le programme doit essentiellement imprimer le nombre 1 à LIMIT (un nombre arbitraire) dans l'ordre croissant. Un thread est assigné pour imprimer chaque numéro, il attend que sa variable de condition soit signalée et il imprime le numéro.

Le programme fonctionne bien jusqu'à LIMIT = 380. Plus que cela, le programme se bloque. C'est à dire, je ne pense pas que pthread_create() renvoie une erreur depuis que j'ai essayé d'imprimer le numéro de l'erreur et aussi inclus fflush (stdout) en cas d'erreur.

Le nombre maximal de threads pour le système peut être spécifié dans/proc/sys/kernel/threads-max. J'ai essayé de l'augmenter arbitrairement, sans succès. Le programme se bloque si le nombre de threads est d'environ 380.

Des idées pourquoi ce pourrait être le cas? Est-ce que cette valeur '380' diffère selon les systèmes?

Merci et salutations,
Hrishikesh Murali

Répondre

0

j'ai changé LIMIT être et il des erreurs 50000 sur le manque de mémoire, ce qui est ce que je pensais, après environ 32000 threads. Sinon, cela fonctionne bien.

J'ai fait ce petit changement pour arrêter l'exécution sur l'erreur pthread_create.

if (ret_val) 
    { 
     printf("Couldn't create thread number %d - %s\n", iter, strerror(ret_val)); 
     fflush(stdout); 
     exit(1); 
    } 

Puisque vous ne vous arrêtez pas sur une erreur peut-être vous vient de tomber à travers et a commencé les numéros d'impression et n'a pas vu votre message d'erreur?

De toute façon je suppose que l'erreur s'appliquera à votre machine. Les threads utilisent la mémoire et la mémoire n'est pas infinie bien que 380 semble un peu faible. Peut-être que la taille de la pile de threads est élevée sur votre machine?

Puisqu'il s'agit d'un programme jouet, changez-le pour lancer l'impression après la sortie de pthread_create, puis rebouclez et continuez à créer des threads. Vous devriez pthread_join vos discussions ou les créer comme détachées.

+0

Oh, d'accord. Je vais essayer et revenir. :-) –