Files
gluttons/philo_two/srcs/philo_two/init_philos.c
2026-01-09 15:45:59 +01:00

82 lines
2.1 KiB
C

/* ************************************************************************** */
/* */
/* ::: :::::::: */
/* init_philos.c :+: :+: :+: */
/* +:+ +:+ +:+ */
/* By: lejulien <lejulien@student.42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2021/04/16 16:24:12 by lejulien #+# #+# */
/* Updated: 2021/04/21 17:49:22 by lejulien ### ########.fr */
/* */
/* ************************************************************************** */
#include "philo.h"
static void
*philosopher(void *philos)
{
t_philo *phi;
phi = (t_philo *)philos;
phi->state = (phi->id % 2 == 0) ? SLEEP : THINK;
usleep(500);
while (!phi->data->is_dead && phi->state != DIED)
phi->data->routine[phi->state](phi);
if (phi->state == DIED)
{
display_state(phi);
phi->data->is_dead = 1;
}
sem_post(phi->data->forks);
return (NULL);
}
static void
check_death(t_philo *phi)
{
int i;
i = 0;
while (1)
{
if (ft_get_ct(&phi[i].start) - phi[i].last_eat > phi->data->time_to_die
&& (phi[i].state != EAT || phi->data->time_to_die <
phi->data->time_to_eat))
{
if (phi[i].state == THINK)
{
phi[i].state = DIED;
display_state(&phi[i]);
phi[i].state = THINK;
phi->data->is_dead = 1;
}
else
phi[i].state = DIED;
break ;
}
if (phi->data->phi_filled == phi->data->nbr)
phi->data->is_dead = 1;
i++;
(i == phi->data->nbr) ? i = 0 : 0;
}
}
void
init_philos(t_philo *philos)
{
int i;
pthread_t origin[philos->data->nbr];
i = -1;
while (++i < philos->data->nbr)
{
gettimeofday(&philos[i].start, NULL);
pthread_create(&origin[i], NULL, philosopher, &philos[i]);
}
usleep(2000);
check_death(philos);
i = -1;
while (++i < philos->data->nbr)
pthread_join(origin[i], NULL);
}