aboutsummaryrefslogtreecommitdiff
path: root/philo_one/src
diff options
context:
space:
mode:
authorCharles Cabergs <me@cacharle.xyz>2021-01-08 22:11:19 +0100
committerCharles Cabergs <me@cacharle.xyz>2021-01-08 22:11:19 +0100
commita69a877b3a2758aafe3de0db87a56063b28ed00f (patch)
tree2f0e61aa28cea420fd808fb51eee46ba004d9698 /philo_one/src
parent36c5e3a81de8b910bc04a37994b53296c1540353 (diff)
downloadphilosophers-a69a877b3a2758aafe3de0db87a56063b28ed00f.tar.gz
philosophers-a69a877b3a2758aafe3de0db87a56063b28ed00f.tar.bz2
philosophers-a69a877b3a2758aafe3de0db87a56063b28ed00f.zip
Add sem_grab in philo_two and philo_three to fix philosophers each taking 1 fork
Diffstat (limited to 'philo_one/src')
-rw-r--r--philo_one/src/event.c3
-rw-r--r--philo_one/src/philo.c33
-rw-r--r--philo_one/src/routine.c19
3 files changed, 43 insertions, 12 deletions
diff --git a/philo_one/src/event.c b/philo_one/src/event.c
index 025435f..df621b4 100644
--- a/philo_one/src/event.c
+++ b/philo_one/src/event.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/14 21:37:50 by cacharle #+# #+# */
-/* Updated: 2021/01/08 16:02:43 by charles ### ########.fr */
+/* Updated: 2021/01/08 18:27:33 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -37,6 +37,7 @@ void event_eat(t_philo *arg)
return ;
philo_put(arg->id, EVENT_EAT, arg->conf->initial_time);
pthread_mutex_unlock(&arg->conf->mutex_stdout);
+ arg->time_last_eat = h_time_now();
h_sleep(arg->conf->timeout_eat);
}
diff --git a/philo_one/src/philo.c b/philo_one/src/philo.c
index 589e1c7..1e98fa0 100644
--- a/philo_one/src/philo.c
+++ b/philo_one/src/philo.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/09 23:47:14 by cacharle #+# #+# */
-/* Updated: 2021/01/08 16:15:10 by charles ### ########.fr */
+/* Updated: 2021/01/08 18:56:10 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -41,6 +41,8 @@ bool philos_start(t_philo *philos, long int num)
i = -1;
while (++i < num)
{
+ if (i % 2 == 0)
+ continue;
if (pthread_create(
&philos[i].thread,
NULL,
@@ -55,8 +57,35 @@ bool philos_start(t_philo *philos, long int num)
i = -1;
while (++i < num)
{
+ if (i % 2 == 0)
+ continue;
pthread_mutex_unlock(&philos[i].mutex_start);
- /* usleep(1000); */
+ /* usleep(200); */
+ }
+ i = -1;
+ while (++i < num)
+ {
+ if (i % 2 == 1)
+ continue;
+ if (pthread_create(
+ &philos[i].thread,
+ NULL,
+ (t_routine)routine_philo,
+ (void*)(philos + i)) != 0)
+ {
+ while (--i >= 0)
+ pthread_detach(philos[i].thread);
+ return (false);
+ }
+ }
+ usleep(1000);
+ i = -1;
+ while (++i < num)
+ {
+ if (i % 2 == 1)
+ continue;
+ pthread_mutex_unlock(&philos[i].mutex_start);
+ /* usleep(200); */
}
return (true);
diff --git a/philo_one/src/routine.c b/philo_one/src/routine.c
index b3fc71a..05304fe 100644
--- a/philo_one/src/routine.c
+++ b/philo_one/src/routine.c
@@ -6,7 +6,7 @@
/* By: cacharle <marvin@42.fr> +#+ +:+ +#+ */
/* +#+#+#+#+#+ +#+ */
/* Created: 2020/02/10 01:11:27 by cacharle #+# #+# */
-/* Updated: 2021/01/08 16:14:57 by charles ### ########.fr */
+/* Updated: 2021/01/08 18:52:48 by charles ### ########.fr */
/* */
/* ************************************************************************** */
@@ -35,23 +35,24 @@ void *routine_philo(t_philo *arg)
pthread_t thread_death;
long int eat_counter;
+ eat_counter = 0;
pthread_mutex_lock(&arg->mutex_start);
if (philo_finished(arg->conf))
return (NULL);
- if (arg->conf->philo_num % 2 == 0 && arg->id % 2 == 0)
- usleep(1000);
- if (arg->conf->philo_num % 2 == 1 && arg->id % 3 == 0)
- usleep(1000);
- if (arg->conf->philo_num % 2 == 1 && arg->id % 3 == 1)
- usleep(2000);
+ /* if (arg->conf->philo_num % 2 == 0 && arg->id % 2 == 0) */
+ /* usleep(1000); */
+ /* if (arg->conf->philo_num % 2 == 1 && arg->id % 3 == 0) */
+ /* usleep(1000); */
+ /* if (arg->conf->philo_num % 2 == 1 && arg->id % 3 == 1) */
+ /* usleep(2000); */
arg->time_last_eat = h_time_now();
if (pthread_create(&thread_death, NULL, (t_routine)routine_death, arg) != 0)
return (NULL);
- eat_counter = 0;
+ arg->time_last_eat = h_time_now();
while (!philo_finished(arg->conf))
{
event_take_fork(arg);
- arg->time_last_eat = h_time_now();
+ /* arg->time_last_eat = h_time_now(); */
event_eat(arg);
eat_counter++;
st_check_meal_num_finished(arg, eat_counter);