let them think
This commit is contained in:
parent
eb85c4c385
commit
dd686a4f85
@ -25,7 +25,7 @@ CC = cc
|
|||||||
RM = rm -rf
|
RM = rm -rf
|
||||||
|
|
||||||
INCLUDES = -I./$(INC_PATH)
|
INCLUDES = -I./$(INC_PATH)
|
||||||
CFLAGS = -Wall -Wextra -Werror -MMD -g
|
CFLAGS = -Wall -Wextra -Werror -MMD -g
|
||||||
|
|
||||||
UNAME_S := $(shell uname -s)
|
UNAME_S := $(shell uname -s)
|
||||||
ifeq ($(UNAME_S),Linux)
|
ifeq ($(UNAME_S),Linux)
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:27:34 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:27:34 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:34 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:13:50 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -81,10 +81,14 @@ int join_threads(t_rules *rules);
|
|||||||
void print_rules(t_rules *rules);
|
void print_rules(t_rules *rules);
|
||||||
int check_death(t_philo *philo);
|
int check_death(t_philo *philo);
|
||||||
void philo_die(t_philo *philo);
|
void philo_die(t_philo *philo);
|
||||||
int philo_died_while_sleeping(t_philo *philo, int time);
|
|
||||||
int philo_eat(t_philo *philo);
|
int philo_eat(t_philo *philo);
|
||||||
void *monitor_routine(void *arg);
|
void *monitor_routine(void *arg);
|
||||||
int check_philos(t_rules *rules);
|
int check_philos(t_rules *rules);
|
||||||
int ft_min(int a, int b);
|
int ft_min(int a, int b);
|
||||||
|
void set_finished(t_rules *rules);
|
||||||
|
int get_finished(t_rules *rules);
|
||||||
|
void synchronize_philos(t_philo *philo);
|
||||||
|
int philo_sleep(t_philo *philo, int time);
|
||||||
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@ -1,18 +0,0 @@
|
|||||||
/* ************************************************************************** */
|
|
||||||
/* */
|
|
||||||
/* ::: o_ :::::: ::: */
|
|
||||||
/* check_alive.c :+: / :+::+: :+: */
|
|
||||||
/* +:+ > +:++:+ +:+ */
|
|
||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
|
||||||
/* Created: 2025/01/20 14:26:43 by whaffman #+#+# #+#+# #+# #+# | */
|
|
||||||
/* Updated: 2025/01/20 14:27:35 by whaffman ### ### ### ### / \ */
|
|
||||||
/* */
|
|
||||||
/* ************************************************************************** */
|
|
||||||
|
|
||||||
#include "philo.h"
|
|
||||||
|
|
||||||
int check_death(t_philo *philo)
|
|
||||||
{
|
|
||||||
return (get_time() - philo->last_meal >= philo->rules->time_to_die);
|
|
||||||
}
|
|
||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:26:44 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:26:44 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:35 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:13:51 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -21,9 +21,6 @@ int create_mutexes(t_rules *rules)
|
|||||||
return (FAILURE);
|
return (FAILURE);
|
||||||
if (pthread_mutex_init(rules->print_lock, NULL))
|
if (pthread_mutex_init(rules->print_lock, NULL))
|
||||||
return (FAILURE);
|
return (FAILURE);
|
||||||
rules->forks = malloc(rules->n_philos * sizeof(pthread_mutex_t));
|
|
||||||
if (!rules->forks)
|
|
||||||
return (FAILURE);
|
|
||||||
while (i < rules->n_philos)
|
while (i < rules->n_philos)
|
||||||
{
|
{
|
||||||
if (pthread_mutex_init(&rules->forks[i], NULL))
|
if (pthread_mutex_init(&rules->forks[i], NULL))
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:26:45 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:26:45 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:36 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:13:52 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:26:45 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:26:45 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:37 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:13:53 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:26:46 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:26:46 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:38 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:13:53 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:26:46 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:26:46 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:39 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:13:54 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -14,6 +14,14 @@
|
|||||||
|
|
||||||
void free_philos(t_rules *rules)
|
void free_philos(t_rules *rules)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
|
i = 0;
|
||||||
|
while (i < rules->n_philos)
|
||||||
|
{
|
||||||
|
free(rules->philos[i].pid);
|
||||||
|
i++;
|
||||||
|
}
|
||||||
|
free(rules->monitor);
|
||||||
free(rules->philos);
|
free(rules->philos);
|
||||||
free(rules->forks);
|
free(rules->forks);
|
||||||
free(rules->print_lock);
|
free(rules->print_lock);
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:26:47 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:26:47 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:39 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:13:57 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:26:48 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:26:48 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:40 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:13:58 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:26:48 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:26:48 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:40 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:13:59 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
@ -6,102 +6,12 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:26:49 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:26:49 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:41 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:14:02 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
#include "philo.h"
|
#include "philo.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
void set_finished(t_rules *rules)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(rules->finished_lock);
|
|
||||||
rules->finished = 1;
|
|
||||||
pthread_mutex_unlock(rules->finished_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_finished(t_rules *rules)
|
|
||||||
{
|
|
||||||
int finished;
|
|
||||||
|
|
||||||
pthread_mutex_lock(rules->finished_lock);
|
|
||||||
finished = rules->finished;
|
|
||||||
pthread_mutex_unlock(rules->finished_lock);
|
|
||||||
return (finished);
|
|
||||||
}
|
|
||||||
|
|
||||||
void set_death(t_philo *philo)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(philo->death_lock);
|
|
||||||
philo->death = 1;
|
|
||||||
pthread_mutex_unlock(philo->death_lock);
|
|
||||||
}
|
|
||||||
|
|
||||||
int get_death(t_philo *philo)
|
|
||||||
{
|
|
||||||
int death;
|
|
||||||
|
|
||||||
pthread_mutex_lock(philo->death_lock);
|
|
||||||
death = philo->death;
|
|
||||||
pthread_mutex_unlock(philo->death_lock);
|
|
||||||
return (death);
|
|
||||||
}
|
|
||||||
|
|
||||||
void philo_die(t_philo *philo)
|
|
||||||
{
|
|
||||||
print_status(philo, "died");
|
|
||||||
philo->death = 1;
|
|
||||||
set_finished(philo->rules);
|
|
||||||
pthread_mutex_unlock(philo->l_fork);
|
|
||||||
pthread_mutex_unlock(philo->r_fork);
|
|
||||||
}
|
|
||||||
|
|
||||||
int philo_sleep(t_philo *philo, int time)
|
|
||||||
{
|
|
||||||
const int start = get_time();
|
|
||||||
|
|
||||||
while (get_time() - start < time)
|
|
||||||
{
|
|
||||||
if (philo->death)
|
|
||||||
return (FAILURE);
|
|
||||||
usleep(50);
|
|
||||||
}
|
|
||||||
return (SUCCESS);
|
|
||||||
}
|
|
||||||
int philo_eat(t_philo *philo)
|
|
||||||
{
|
|
||||||
if (philo->id % 2 == 1)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(philo->r_fork);
|
|
||||||
print_status(philo, "has taken a fork");
|
|
||||||
}
|
|
||||||
pthread_mutex_lock(philo->l_fork);
|
|
||||||
print_status(philo, "has taken a fork");
|
|
||||||
if (philo->id % 2 != 1)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(philo->r_fork);
|
|
||||||
print_status(philo, "has taken a fork");
|
|
||||||
}
|
|
||||||
if (philo->death)
|
|
||||||
return (FAILURE);
|
|
||||||
print_status(philo, "is eating");
|
|
||||||
philo->last_meal = get_time();
|
|
||||||
philo->n_eat++;
|
|
||||||
return (SUCCESS);
|
|
||||||
}
|
|
||||||
void synchronize_philos(t_philo *philo)
|
|
||||||
{
|
|
||||||
pthread_mutex_lock(philo->rules->finished_lock);
|
|
||||||
pthread_mutex_unlock(philo->rules->finished_lock);
|
|
||||||
philo->last_meal = get_time();
|
|
||||||
if (philo->id % 2 == 1)
|
|
||||||
{
|
|
||||||
print_status(philo, "is thinking");
|
|
||||||
usleep(philo->rules->time_to_eat * 10);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void *philo_routine(void *arg)
|
void *philo_routine(void *arg)
|
||||||
{
|
{
|
||||||
t_philo *philo;
|
t_philo *philo;
|
||||||
@ -110,20 +20,20 @@ void *philo_routine(void *arg)
|
|||||||
synchronize_philos(philo);
|
synchronize_philos(philo);
|
||||||
while (!philo->death && !get_finished(philo->rules))
|
while (!philo->death && !get_finished(philo->rules))
|
||||||
{
|
{
|
||||||
if (philo->death)
|
|
||||||
break ;
|
|
||||||
if (!philo_eat(philo))
|
if (!philo_eat(philo))
|
||||||
break ;
|
break ;
|
||||||
if (!philo_sleep(philo, philo->rules->time_to_eat))
|
if (!philo_sleep(philo, philo->rules->time_to_eat))
|
||||||
break ;
|
break ;
|
||||||
pthread_mutex_unlock(philo->l_fork);
|
pthread_mutex_unlock(philo->l_fork);
|
||||||
pthread_mutex_unlock(philo->r_fork);
|
pthread_mutex_unlock(philo->r_fork);
|
||||||
if (!philo->death)
|
if (!philo->death && !get_finished(philo->rules))
|
||||||
print_status(philo, "is sleeping");
|
print_status(philo, "is sleeping");
|
||||||
if (!philo_sleep(philo, philo->rules->time_to_sleep))
|
if (!philo_sleep(philo, philo->rules->time_to_sleep))
|
||||||
break;
|
break ;
|
||||||
if(!philo->death)
|
if(!philo->death && !get_finished(philo->rules))
|
||||||
print_status(philo, "is thinking");
|
print_status(philo, "is thinking");
|
||||||
|
if (!philo_sleep(philo, (philo->rules->time_to_die - philo->rules->time_to_eat - philo->rules->time_to_sleep) / 3))
|
||||||
|
break ;
|
||||||
}
|
}
|
||||||
return (NULL);
|
return (NULL);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:27:08 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:27:08 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:42 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:14:05 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:27:09 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:27:09 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:42 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:14:05 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:27:10 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:27:10 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:43 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:14:06 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
@ -6,7 +6,7 @@
|
|||||||
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
/* By: whaffman <whaffman@student.codam.nl> +#+ +:+ +#++#++:++#++ */
|
||||||
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
/* +#+ +#+#+ +#++#+ +#+ \o/ */
|
||||||
/* Created: 2025/01/20 14:27:10 by whaffman #+#+# #+#+# #+# #+# | */
|
/* Created: 2025/01/20 14:27:10 by whaffman #+#+# #+#+# #+# #+# | */
|
||||||
/* Updated: 2025/01/20 14:27:44 by whaffman ### ### ### ### / \ */
|
/* Updated: 2025/01/27 14:14:07 by whaffman ### ### ### ### / \ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user