Salut
J'ai créé une application nécessitant de créer de nombreux threads mais bizarrement, au bout d'un certain nombre, je ne peux plus en créer.
Je détaille :
Je suis sous linux en noyau 2.4.x et glibc 2.2.x . J'ai créé une application multithread graphique (sous X) et j'utilise les fonctions pthread_ pour gerer mes threads.
Voici mon pb (peut etre je m'y prends mal) :
j'ai un thread de reception qui lit sur le port série des trames de facon asynchrone (sous entendu je ne peux pas prévoir quand je les recois) et qui dispatche le resultat dans l'application selon certains parametres.
J'ai une tâche qui consiste a scanner un certain nombre d'appareil (en parametre dans un fichier) sur un bus CAN , et ce scan se fait via le meme port serie (en émission cette fois ci). On imagine par exemple que j'ai X appareil, j'envoie donc une série de X trames tous les y ms et j'attends la reponse.
Seulement je ne peux pas attendre la reponse d'un appareil avant d'envoyer la trame suivante (puisque si un appareil ne repondait pas, le process se retrouverait bloqué), j'envoie donc toutes les trames d'un coup (espacée de y ms) et a chaque envoi, je cree un thread qui va "attendre" 2000 ms, et au bout de ces 2000ms si la trame n'a pas été recue, met un flag pour dire que l'appareil ne repond et se termine.
Au final on a donc X threads créés , qui se terminent chacun au bout de 2000ms.
Mais apparemment ca ne fonctionne pas, en effet l'algo fonctionne parfaitement, mais au bout d'un certain nombre de thread créés , je ne peux plus en créer (valeur de retour de pthread_create retourne une erreur). Je suis obligé de quitter l'application pour pouvoir a nouveau en créer.
Je pense donc que j'ai fait une erreur quelque part mais je ne vois pas bien ou.
Je donne un code exemple qui resume ce que j'ai fait :
Je n'ai pas tout mis le code mais l'idée est la.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 // fonction qui lance l'ecriture des trames void StartScan() { int ret; MODULE *m = m_pListModule; while (m != NULL) { m_pBitbus->Sendrequest(m->dwID); // envoie la trame sur le port serie ret = pthread_create(m->hThreadDelay,NULL,DelayThreadFunc,m); if (ret != 0) { Log(LOGLEVEL_ERROR,"Error : creating thread"); } } } //fonction de thread void * DelayThreadFunc(void * pParam) { MODULE *m = (MODULE *)pParam; usleep(m->timeToLeave); if (m->dwReceiveFlag != REQUEST_RECEIVED) { m->dwReceiveFlag = REQUEST_NOTRESPONDING; } return NULL; }
Pour moi, le thread se termine lorsque la fonction associée (ici DelayThreadFunc) se termine, mais ca n'a l'air visiblement pas le cas. Aurai-je oublié un détail important ?
Merci de m'avoir lu jusqu'au bout
Partager