just the norm
This commit is contained in:
parent
5309cbd7fd
commit
8db8d2c8d4
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> // \ \ __| | | \ \/ / */
|
/* By: houtworm <codam@houtworm.net> // \ \ __| | | \ \/ / */
|
||||||
/* (| | )|_| |_| |> < */
|
/* (| | )|_| |_| |> < */
|
||||||
/* Created: 2023/03/11 07:19:18 by houtworm /'\_ _/`\__|\__,_/_/\_\ */
|
/* Created: 2023/03/11 07:19:18 by houtworm /'\_ _/`\__|\__,_/_/\_\ */
|
||||||
/* Updated: 2023/05/21 22:38:50 by djonker \___)=(___/ */
|
/* Updated: 2023/05/22 04:46:06 by djonker \___)=(___/ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -19,6 +19,7 @@
|
|||||||
# include <fcntl.h>
|
# include <fcntl.h>
|
||||||
# include <signal.h>
|
# include <signal.h>
|
||||||
# include <semaphore.h>
|
# include <semaphore.h>
|
||||||
|
# include <pthread.h>
|
||||||
# include <sys/time.h>
|
# include <sys/time.h>
|
||||||
# include <sys/wait.h>
|
# include <sys/wait.h>
|
||||||
|
|
||||||
@ -36,11 +37,13 @@ typedef struct s_philo
|
|||||||
long long *eattime;
|
long long *eattime;
|
||||||
long long *sleeptime;
|
long long *sleeptime;
|
||||||
long long *strtt;
|
long long *strtt;
|
||||||
|
int *alive;
|
||||||
int *target;
|
int *target;
|
||||||
sem_t *done;
|
sem_t *done;
|
||||||
sem_t *dead;
|
sem_t *dead;
|
||||||
sem_t *hold;
|
sem_t *hold;
|
||||||
sem_t *print;
|
sem_t *print;
|
||||||
|
pthread_t thrd;
|
||||||
} t_philo;
|
} t_philo;
|
||||||
|
|
||||||
typedef struct s_strct
|
typedef struct s_strct
|
||||||
@ -54,6 +57,7 @@ typedef struct s_strct
|
|||||||
long long sleeptime;
|
long long sleeptime;
|
||||||
long long strtt;
|
long long strtt;
|
||||||
int target;
|
int target;
|
||||||
|
int alive;
|
||||||
sem_t *done;
|
sem_t *done;
|
||||||
sem_t *dead;
|
sem_t *dead;
|
||||||
sem_t *hold;
|
sem_t *hold;
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> // \ \ __| | | \ \/ / */
|
/* By: houtworm <codam@houtworm.net> // \ \ __| | | \ \/ / */
|
||||||
/* (| | )|_| |_| |> < */
|
/* (| | )|_| |_| |> < */
|
||||||
/* Created: 2023/03/15 02:00:19 by houtworm /'\_ _/`\__|\__,_/_/\_\ */
|
/* Created: 2023/03/15 02:00:19 by houtworm /'\_ _/`\__|\__,_/_/\_\ */
|
||||||
/* Updated: 2023/05/21 23:42:42 by djonker \___)=(___/ */
|
/* Updated: 2023/05/22 05:47:07 by djonker \___)=(___/ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -98,6 +98,7 @@ int ft_releasetheminds(t_strct *strct, int m)
|
|||||||
i = 0;
|
i = 0;
|
||||||
if (m)
|
if (m)
|
||||||
{
|
{
|
||||||
|
strct->strtt = ft_time();
|
||||||
while (i < strct->philos)
|
while (i < strct->philos)
|
||||||
{
|
{
|
||||||
sem_post(strct->hold);
|
sem_post(strct->hold);
|
||||||
@ -123,6 +124,7 @@ int ft_releasetheminds(t_strct *strct, int m)
|
|||||||
void ft_safeprint(t_philo *ps, char *str)
|
void ft_safeprint(t_philo *ps, char *str)
|
||||||
{
|
{
|
||||||
sem_wait(ps->print);
|
sem_wait(ps->print);
|
||||||
|
if (*ps->alive)
|
||||||
printf("%lld %d %s\n", ft_time() - *ps->strtt, ps->id, str);
|
printf("%lld %d %s\n", ft_time() - *ps->strtt, ps->id, str);
|
||||||
sem_post(ps->print);
|
sem_post(ps->print);
|
||||||
}
|
}
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> // \ \ __| | | \ \/ / */
|
/* By: houtworm <codam@houtworm.net> // \ \ __| | | \ \/ / */
|
||||||
/* (| | )|_| |_| |> < */
|
/* (| | )|_| |_| |> < */
|
||||||
/* Created: 2023/03/11 06:42:31 by houtworm /'\_ _/`\__|\__,_/_/\_\ */
|
/* Created: 2023/03/11 06:42:31 by houtworm /'\_ _/`\__|\__,_/_/\_\ */
|
||||||
/* Updated: 2023/05/21 23:42:45 by djonker \___)=(___/ */
|
/* Updated: 2023/05/22 05:49:17 by djonker \___)=(___/ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -15,11 +15,11 @@
|
|||||||
int ft_eatsleepthink(t_philo *ps)
|
int ft_eatsleepthink(t_philo *ps)
|
||||||
{
|
{
|
||||||
sem_wait(ps->forks);
|
sem_wait(ps->forks);
|
||||||
if (ft_time() - ps->lastfood > *ps->dietime)
|
/*if (ft_time() - ps->lastfood > *ps->dietime)*/
|
||||||
return (1);
|
/*return (1);*/
|
||||||
ft_safeprint(ps, "has taken a fork");
|
ft_safeprint(ps, "has taken a fork");
|
||||||
if (*ps->philos == 1)
|
/*if (*ps->philos == 1)*/
|
||||||
return (1);
|
/*return (1);*/
|
||||||
sem_wait(ps->forks);
|
sem_wait(ps->forks);
|
||||||
ft_safeprint(ps, "has taken a fork");
|
ft_safeprint(ps, "has taken a fork");
|
||||||
ps->lastfood = ft_time();
|
ps->lastfood = ft_time();
|
||||||
@ -36,10 +36,24 @@ int ft_eatsleepthink(t_philo *ps)
|
|||||||
ft_safeprint(ps, "is thinking");
|
ft_safeprint(ps, "is thinking");
|
||||||
ps->cycles++;
|
ps->cycles++;
|
||||||
if (ps->cycles == *ps->target)
|
if (ps->cycles == *ps->target)
|
||||||
return (2);
|
sem_post(ps->done);
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void *ft_alivecheck(void *pointer)
|
||||||
|
{
|
||||||
|
t_philo *philo;
|
||||||
|
|
||||||
|
philo = pointer;
|
||||||
|
while (ft_time() - philo->lastfood < *philo->dietime)
|
||||||
|
usleep(500);
|
||||||
|
sem_post(philo->dead);
|
||||||
|
sem_wait(philo->print);
|
||||||
|
if (*philo->alive)
|
||||||
|
printf("%lld %d died\n", ft_time() - *philo->strtt, philo->id);
|
||||||
|
return (NULL);
|
||||||
|
}
|
||||||
|
|
||||||
void ft_cycle(void *pointer)
|
void ft_cycle(void *pointer)
|
||||||
{
|
{
|
||||||
t_philo *philo;
|
t_philo *philo;
|
||||||
@ -51,17 +65,14 @@ void ft_cycle(void *pointer)
|
|||||||
sem_wait(philo->hold);
|
sem_wait(philo->hold);
|
||||||
philo->dead = sem_open("dead", 0);
|
philo->dead = sem_open("dead", 0);
|
||||||
philo->done = sem_open("done", 0);
|
philo->done = sem_open("done", 0);
|
||||||
|
philo->print = sem_open("print", 0);
|
||||||
if ((philo->id - 1) % 2)
|
if ((philo->id - 1) % 2)
|
||||||
usleep(*philo->eattime * 1000);
|
usleep(*philo->eattime * 1000);
|
||||||
while (!ret)
|
while (!ret)
|
||||||
ret = ft_eatsleepthink(philo);
|
ret = ft_eatsleepthink(philo);
|
||||||
if (ret == 1)
|
sem_wait(philo->print);
|
||||||
{
|
*philo->alive = 0;
|
||||||
printf("%lld %d died\n", ft_time() - *philo->strtt, philo->id);
|
sem_post(philo->print);
|
||||||
sem_post(philo->dead);
|
|
||||||
}
|
|
||||||
if (ret == 2)
|
|
||||||
sem_post(philo->done);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int ft_startcycle(t_strct *strct)
|
int ft_startcycle(t_strct *strct)
|
||||||
@ -72,20 +83,25 @@ int ft_startcycle(t_strct *strct)
|
|||||||
strct->strtt = ft_time();
|
strct->strtt = ft_time();
|
||||||
while (i < strct->philos)
|
while (i < strct->philos)
|
||||||
{
|
{
|
||||||
strct->philo[i].lastfood = ft_time();
|
|
||||||
strct->pid[i] = fork();
|
strct->pid[i] = fork();
|
||||||
|
strct->alive = 1;
|
||||||
if (strct->pid[i] == 0)
|
if (strct->pid[i] == 0)
|
||||||
{
|
{
|
||||||
|
strct->philo[i].alive = &strct->alive;
|
||||||
|
pthread_create(&strct->philo[i].thrd, NULL, ft_alivecheck, &strct->philo[i]);
|
||||||
|
strct->philo[i].lastfood = ft_time();
|
||||||
ft_cycle(&strct->philo[i]);
|
ft_cycle(&strct->philo[i]);
|
||||||
sem_close(strct->dead);
|
sem_close(strct->dead);
|
||||||
sem_close(strct->done);
|
sem_close(strct->done);
|
||||||
sem_close(strct->hold);
|
sem_close(strct->hold);
|
||||||
sem_close(strct->forks);
|
sem_close(strct->forks);
|
||||||
sem_close(strct->print);
|
sem_close(strct->print);
|
||||||
|
pthread_join(strct->philo[i].thrd, NULL);
|
||||||
free(strct);
|
free(strct);
|
||||||
exit(0);
|
exit(0);
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
|
usleep(1000);
|
||||||
}
|
}
|
||||||
return (0);
|
return (0);
|
||||||
}
|
}
|
||||||
@ -94,6 +110,7 @@ int ft_cyclecounter(t_strct *strct)
|
|||||||
{
|
{
|
||||||
int i;
|
int i;
|
||||||
sem_t *done;
|
sem_t *done;
|
||||||
|
sem_t *print;
|
||||||
int philos;
|
int philos;
|
||||||
int target;
|
int target;
|
||||||
|
|
||||||
@ -106,15 +123,17 @@ int ft_cyclecounter(t_strct *strct)
|
|||||||
sem_close(strct->print);
|
sem_close(strct->print);
|
||||||
free(strct);
|
free(strct);
|
||||||
done = sem_open("done", 0);
|
done = sem_open("done", 0);
|
||||||
|
print = sem_open("print", 0);
|
||||||
i = 0;
|
i = 0;
|
||||||
while (i < philos)
|
while (i < philos)
|
||||||
{
|
{
|
||||||
sem_wait(done);
|
sem_wait(done);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
printf("All %d philosophers have", philos);
|
|
||||||
printf(" finished all %d cycles\n", target);
|
|
||||||
sem_close(done);
|
sem_close(done);
|
||||||
|
sem_wait(print);
|
||||||
|
printf("All philosophers have finished all %d cycles\n", target);
|
||||||
|
sem_close(print);
|
||||||
exit (0);
|
exit (0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -6,7 +6,7 @@
|
|||||||
/* By: houtworm <codam@houtworm.net> // \ \ __| | | \ \/ / */
|
/* By: houtworm <codam@houtworm.net> // \ \ __| | | \ \/ / */
|
||||||
/* (| | )|_| |_| |> < */
|
/* (| | )|_| |_| |> < */
|
||||||
/* Created: 2023/03/15 02:01:41 by houtworm /'\_ _/`\__|\__,_/_/\_\ */
|
/* Created: 2023/03/15 02:01:41 by houtworm /'\_ _/`\__|\__,_/_/\_\ */
|
||||||
/* Updated: 2023/05/21 22:11:28 by djonker \___)=(___/ */
|
/* Updated: 2023/05/22 04:34:47 by djonker \___)=(___/ */
|
||||||
/* */
|
/* */
|
||||||
/* ************************************************************************** */
|
/* ************************************************************************** */
|
||||||
|
|
||||||
@ -81,6 +81,7 @@ int ft_cleanup(t_strct *strct)
|
|||||||
kill(strct->pid[502], 15);
|
kill(strct->pid[502], 15);
|
||||||
while (i < strct->philos)
|
while (i < strct->philos)
|
||||||
{
|
{
|
||||||
|
pthread_join(strct->philo[i].thrd, NULL);
|
||||||
kill(strct->pid[i], 15);
|
kill(strct->pid[i], 15);
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user