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 ) :
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;
Segment Fault spotted line 9 !
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);
}
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);
}
Merci d'avance pour votre aide.