Bonjour,
J'espère que je suis dans la bonne rubrique du forum.
Je cherche à parallèliser une application à l'aide de threads. Je souhaite définir un nombre de processus pouvant tourner en parallèle et découper automatiquement mon application en fonction de ce nombre.
Pour cela j'ai voulu tester le code suivant sur un exemple simple:
Je souhaitais que la boucle while crée les processus automatiquement jusqu'à ce que les nPE-1 threads soient utilisés. Une fois tous les thread utilisés, elle parcours la boucle while jusqu'à ce qu'elle trouve un thread libéré pour le réutiliser.
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
31
32
33
34
35
36
37 #include "stdio.h" #include "math.h" #include "time.h" #include "pthread.h" #include "stdlib.h" #define nPE 4 /*nombre de processeur*/ void* mafonction(void* p_data) { int i; int cpt=0; for(i=0;i<10000;i++) {cpt++;} return NULL; } int main() { pthread_t thread[nPE-1]; int i; int num_thread; num_thread=0; for(i=0;i<30;i++) { while(pthread_create(&thread[num_thread],NULL,mafonction,NULL)!=0) {num_thread=(num_thread+1)%(nPE-1);} num_thread=(num_thread+1)%(nPE-1); } return 0; }
Pour cela je me suis basé sur l'hypothèse que la fonction pthread_create renverait une valeur non nulle si le thread existait déjà. Il semblerait que ça ne soit pas le cas.
En débug j'obtiens les résultats suivant:
On constate que je me retrouve avec plus de 5 threads à certains moments de l'exécution alors que je pensais les avoir limité à 3.
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 [Thread debugging using libthread_db enabled] [New Thread 0xb7e2cb70 (LWP 2014)] [New Thread 0xb762bb70 (LWP 2015)] [Thread 0xb7e2cb70 (LWP 2014) exited] [New Thread 0xb6e2ab70 (LWP 2016)] [Thread 0xb762bb70 (LWP 2015) exited] [New Thread 0xb6629b70 (LWP 2017)] [Thread 0xb6e2ab70 (LWP 2016) exited] [New Thread 0xb5e28b70 (LWP 2018)] [Thread 0xb6629b70 (LWP 2017) exited] [Thread 0xb5e28b70 (LWP 2018) exited] [New Thread 0xb5627b70 (LWP 2019)] [New Thread 0xb4e26b70 (LWP 2020)] [New Thread 0xb4625b70 (LWP 2021)] [New Thread 0xb3e24b70 (LWP 2022)] [Thread 0xb5627b70 (LWP 2019) exited] [Thread 0xb4e26b70 (LWP 2020) exited] [New Thread 0xb3623b70 (LWP 2023)] [New Thread 0xb2e22b70 (LWP 2024)] [New Thread 0xb2621b70 (LWP 2025)]
J'attend vos suggestions pour résoudre ce problème et me proposer des solutions pour découper cette application en nPE-1 threads.
J'ai aussi tenté d'utiliser ce genre d'instructions toutes les nPe-1 créations de thread pour résoudre le problème:
Cette instruction devait avoir pour but d'attendre la fin des threads créés pour ensuite les réutiliser.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5 for (i=0;i<nPE-1;i++) { pthread_join(thread[j],NULL); }
Il semblerait donc que je puisse créer plus de thread que ce que j'ai déclaré...
Je ne parviens pas non plus à attendre la fin de leur exécution...
Merci d'avance pour votre aide.
Partager