Matthos Denys 797bb0d3bc philo_one
2021-05-15 19:17:55 +03:00

113 lines
2.3 KiB
C

#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);
messages(philo->all_struct, philo, "eating");
philo->last_eat = ft_get_time() - philo->all_struct->start_time;
philo->count_eat++;
my_usleep(philo->all_struct->time_to_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 cycle(t_philo *philo)
{
take_forks(philo);
eating(philo);
sleeping(philo);
}
int run_observer(t_all *all)
{
int i;
i = 0;
time_t 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() - all->start_time) - all->data_philo->philors[i].last_eat;
// printf("%ld test\n", time);
if (time > all->time_to_die) // TODO пофиксить смерть
{
printf("%ld---------------симуляция окончена фил %d умер ---------------\n", ft_get_time()- all->start_time, i + 1);
exit(0);
}
i++;
// 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);
}