Bonjour,
Encore et toujours j'ai besoin de votre aide !
Je dois réaliser un petit programme représentant le dîner des philosophes (http://fr.wikipedia.org/wiki/D%C3%AEner_des_philosophes) mais impossible de passer outre un segfault venant de la fonction pthread_join(). J'ai pas mal cherché sur le net (mais l'anglais et moi c'est pas encore ça) sans réellement comprendre ce qui pouvait produire ce segfault. Peut-être une histoire de thread pas encore créés (mais après certains test je ne pense pas) ou encore de la valeur du deuxième argument de pthread_join() qui doit être déclaré pour ne pas lui passer NULL mais malgrès cela rien à faire...
Ma structure (liste doublement chainée circulaire ) :
Segment Fault spotted line 9 !
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 typedef struct s_philo { int rank; int nb_eat; t_etat etat; pthread_t th_philo; struct s_philo *next; struct s_philo *prev; int baguette[2]; int lock; } t_philo;
Petite précision : Je segfault lorsque je tente de join le dernier thread.
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 int run(t_philo **list) { t_philo *nav; void *end; nav = *list; while (nav) { if (pthread_join(nav->th_philo, &end) != 0) printf("Can't join !\n"); nav = nav->next; } return (1); } int main() { t_philo *list; t_philo *nav; t_philo *philo; int i; i = 0; list = NULL; while (i < 8) { philo = init_philo(i); add_in_list(&list, &philo); i++; } // D'après mes tests ma liste est correctement remplie, mis à part // pthread_t th_philo, eux c'est start_threads qui s'en charge start_threads(&list); run(&list); return (0); }Merci d'avance pour votre aide.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13 int start_threads(t_philo **list) { t_philo *nav; nav = *list; while (nav->next != *list) { if (pthread_create(&(nav->th_philo), NULL, &engine, &nav) != 0) printf("Cannot create thread n°%i!\n", nav->rank); nav = nav->next; } return (1); }
Partager