From 70bc58707a771b0f8ec05a2e4dd5861415c19391 Mon Sep 17 00:00:00 2001 From: TriantaTV Date: Sat, 1 Oct 2022 23:35:31 -0500 Subject: [PATCH] Philosophers eat, but lacks sem_post order --- DiningPhilosophers.c | 37 ++++++++++++++++++++----------------- DiningPhilosophers.out | Bin 16768 -> 16808 bytes 2 files changed, 20 insertions(+), 17 deletions(-) diff --git a/DiningPhilosophers.c b/DiningPhilosophers.c index efab6a2..9f7551f 100644 --- a/DiningPhilosophers.c +++ b/DiningPhilosophers.c @@ -13,13 +13,14 @@ typedef struct PhilosopherData { int eatingCount; int position; - sem_t semaphore; int state; pthread_t thread; } PhilosopherData; +sem_t semaphore; + bool AllPhilosophersFull(PhilosopherData PhilosopherList[], int numPhilosophers); -void Down(sem_t* semaphore); +void PhilosopherWait(); void Eat(PhilosopherData* philosopherSelected); int GetPhilosopherCount(char* argv); void* Philosopher(void* philosopherPassed); @@ -29,7 +30,7 @@ void PutForks(PhilosopherData* philosopherSelected); void TakeForks(PhilosopherData* philosopherSelected); bool PhilosopherCanEat(PhilosopherData PhilosopherList[], int selectedPosition, int philosopherTotal); void Think(PhilosopherData* philosopherSelected); -void Up(sem_t* semaphore); +void AllowPhilosopher(); int main(int argc, char* argv[]) { @@ -52,23 +53,22 @@ int main(int argc, char* argv[]) bool AllPhilosophersFull(PhilosopherData PhilosopherList[], int numPhilosophers) { for (int i = 0; i < numPhilosophers; i++) - if (PhilosopherList[i].eatingCount < 2) + if (PhilosopherList[i].eatingCount < 1) return false; return true; } // Philosopher enters critical section. -void Down(sem_t* semaphore) +void PhilosopherWait() { - sem_wait(semaphore); - printf("A semaphore was put into waiting...\n"); + printf("A thread was put into waiting...\n"); + sem_wait(&semaphore); } // Sets philosopher to eating state and increments eating count. void Eat(PhilosopherData* philosopherSelected) { printf("Philosopher %d is eating...\n", philosopherSelected->position); - philosopherSelected->state = EATING; ++philosopherSelected->eatingCount; } @@ -98,13 +98,17 @@ void PhilosopherInit(int philosopherTotal) { PhilosopherData PhilosopherList[philosopherTotal]; PhilosopherListInit(PhilosopherList, philosopherTotal); + sem_init(&semaphore, 0, 1); while (!AllPhilosophersFull(PhilosopherList, philosopherTotal)) { + sleep(2); for (int i = 0; i < philosopherTotal; i++) { if (PhilosopherCanEat(PhilosopherList, i, philosopherTotal)) { - Up(&(PhilosopherList[i].semaphore)); + printf("Philosopher %d was allowed to eat...\n", i); + PhilosopherList[i].state = EATING; + AllowPhilosopher(); } } } @@ -117,9 +121,7 @@ void PhilosopherListInit(PhilosopherData PhilosopherList[], int philosopherTotal { PhilosopherList[i].position = i; PhilosopherList[i].eatingCount = 0; - sem_init(&PhilosopherList[i].semaphore, 0, 1); pthread_create(&PhilosopherList[i].thread, NULL, &Philosopher, &PhilosopherList[i]); - pthread_join(PhilosopherList[i].thread, NULL); } } @@ -132,8 +134,9 @@ void PutForks(PhilosopherData* philosopherSelected) // Philosopher takes the forks on the left and right. void TakeForks(PhilosopherData* philosopherSelected) { - printf("Philosopher %d is taking forks...\n", philosopherSelected->position); - Down(&philosopherSelected->semaphore); + philosopherSelected->state = HUNGRY; + printf("Philosopher %d is hungry...\n", philosopherSelected->position); + PhilosopherWait(); } // If philosopher is hungry and forks are free, then returns true. @@ -155,13 +158,13 @@ bool PhilosopherCanEat(PhilosopherData PhilosopherList[], int selectedPosition, // Philosopher begins thinking void Think(PhilosopherData* philosopherSelected) { - philosopherSelected->state = THINKING; printf("Philosopher %d is thinking...\n", philosopherSelected->position); + philosopherSelected->state = THINKING; } // Philosopher exits critical section -void Up(sem_t* semaphore) +void AllowPhilosopher() { - sem_post(semaphore); - printf("A semaphore was released...\n"); + sem_post(&semaphore); + printf("A thread was released...\n"); } diff --git a/DiningPhilosophers.out b/DiningPhilosophers.out index 59a07e9cefb66c0e8047cffd622dddd04735860f..2926701039a6b2ec7e09e410b92e601f36628e48 100755 GIT binary patch delta 2809 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 SZpo8vSx{`tr(Muy%lHTO+C6Om