#include "../includes/philo_header.h" void *run_trhead(t_philo *philo) { philo->worked = 1; while(1) { if (philo->can_run_simulation) break; } if (philo->can_run_simulation) { philo->last_eat = ft_get_time(); philo->limit = philo->last_eat + philo->all_struct->time_to_die; while(philo->can_run_simulation) { cycle(philo); } } return(NULL); } void take_forks(t_philo *philo) { t_all *all; all = philo->all_struct; pthread_mutex_lock(&all->data_philo->mutex[philo->less_fork]); messages(philo->all_struct, philo, "has taken a fork"); pthread_mutex_lock(&all->data_philo->mutex[philo->more_fork]); messages(philo->all_struct, philo, "has taken a fork"); } void eating(t_philo *philo) { pthread_mutex_lock(&philo->eat_mutex); philo->last_eat = ft_get_time(); // philo->limit = philo->last_eat + philo->all_struct->time_to_die; messages(philo->all_struct, philo, "eating"); my_usleep(philo->all_struct->time_to_eat); philo->count_eat++; pthread_mutex_unlock(&philo->eat_mutex); } void sleeping(t_philo *philo) { t_all *all; all = philo->all_struct; messages(philo->all_struct, philo, "sleeping"); pthread_mutex_unlock(&all->data_philo->mutex[philo->more_fork]); pthread_mutex_unlock(&all->data_philo->mutex[philo->less_fork]); my_usleep(philo->all_struct->time_to_sleep); } void ft_msleep(time_t interval_ms) { time_t end_ms = ft_get_time() + interval_ms; time_t now_ms = ft_get_time(); while (now_ms < end_ms) { usleep(_SLEEP_STEP); now_ms = ft_get_time(); } } void my_usleep(time_t time) { time_t t; t = ft_get_time(); while (ft_get_time() - t < time) usleep(1); } void cycle(t_philo *philo) { take_forks(philo); eating(philo); sleeping(philo); // messages(philo->all_struct, philo, "thinking");19835 20240 } int run_observer(t_all *all) { int i; time_t time; time_t temp; i = 0; time = ft_get_time(); while(1) { i = 0; while(i <= all->number_of_philosophers) { pthread_mutex_lock(&all->data_philo->philors[i].eat_mutex); time = ft_get_time(); temp = time - all->start_time - all->data_philo->philors[i].last_eat; if (temp > all->time_to_die) { // TODO пофиксить смерть printf("симуляция окончена фил %d умер\n", i + 1); exit(0); } pthread_mutex_unlock(&all->data_philo->philors[i].eat_mutex); } } return (0); } int runner(t_all *all, int optional) { if (optional) { prepare_resources(all); run_all_phils(all); if (check_all_run(all)) { all->start_time = ft_get_time(); run_simulation(all); } if (!run_observer(all)) { return(0); } } else { return(1); } return(1); }