From c8322811a2e239e79a18bd85016d817d33035ffd Mon Sep 17 00:00:00 2001 From: TriantaTV Date: Mon, 3 Oct 2022 02:28:57 -0500 Subject: [PATCH] Program with 5 philosophers typically works. Currently unable to find cause of variation. --- DiningPhilosophers.c | 39 +++++++++++++++++++++++++-------------- DiningPhilosophers.out | Bin 16808 -> 16808 bytes TestDining.sh | 2 +- 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/DiningPhilosophers.c b/DiningPhilosophers.c index 9f7551f..ec8b3f6 100644 --- a/DiningPhilosophers.c +++ b/DiningPhilosophers.c @@ -53,7 +53,7 @@ int main(int argc, char* argv[]) bool AllPhilosophersFull(PhilosopherData PhilosopherList[], int numPhilosophers) { for (int i = 0; i < numPhilosophers; i++) - if (PhilosopherList[i].eatingCount < 1) + if (PhilosopherList[i].eatingCount < 2) return false; return true; } @@ -69,6 +69,7 @@ void PhilosopherWait() void Eat(PhilosopherData* philosopherSelected) { printf("Philosopher %d is eating...\n", philosopherSelected->position); + philosopherSelected->state = EATING; ++philosopherSelected->eatingCount; } @@ -87,6 +88,11 @@ void* Philosopher(void* philosopherPassed) while (true) { Think(philosopherSelected); /*philosopher is thinking*/ + if (philosopherSelected->eatingCount == 2) + { + printf("Philosopher %d ate twice...\n", philosopherSelected->position); + return; + } TakeForks(philosopherSelected); /*acquire two forks or block*/ Eat(philosopherSelected); /*yum-yum, spaghetti*/ PutForks(philosopherSelected); /*put both forks back on table*/ @@ -101,16 +107,16 @@ void PhilosopherInit(int philosopherTotal) sem_init(&semaphore, 0, 1); while (!AllPhilosophersFull(PhilosopherList, philosopherTotal)) { - sleep(2); for (int i = 0; i < philosopherTotal; i++) { - if (PhilosopherCanEat(PhilosopherList, i, philosopherTotal)) - { - printf("Philosopher %d was allowed to eat...\n", i); - PhilosopherList[i].state = EATING; - AllowPhilosopher(); - } + printf("Philosopher %d state: %d\n", PhilosopherList[i].position, PhilosopherList[i].state); } + AllowPhilosopher(); + sleep(1); + } + for (int i = 0; i < philosopherTotal; i++) + { + printf("Philosopher %d eating count: %d\n", PhilosopherList[i].position, PhilosopherList[i].eatingCount); } } @@ -121,7 +127,9 @@ void PhilosopherListInit(PhilosopherData PhilosopherList[], int philosopherTotal { PhilosopherList[i].position = i; PhilosopherList[i].eatingCount = 0; + PhilosopherList[i].state = THINKING; pthread_create(&PhilosopherList[i].thread, NULL, &Philosopher, &PhilosopherList[i]); + // pthread_join(&PhilosopherList[i].thread, NULL); } } @@ -146,12 +154,15 @@ bool PhilosopherCanEat(PhilosopherData PhilosopherList[], int selectedPosition, { if (PhilosopherList[selectedPosition].state != HUNGRY) return false; - int leftPhilosopher = (selectedPosition + (philosopherTotal-1)) % philosopherTotal; - int rightPhilosopher = (selectedPosition + 1) % philosopherTotal; - if (PhilosopherList[leftPhilosopher].state == EATING) - return false; - if (PhilosopherList[rightPhilosopher].state == EATING) - return false; + // int leftPhilosopher = (selectedPosition + (philosopherTotal-1)) % philosopherTotal; + // int rightPhilosopher = (selectedPosition + 1) % philosopherTotal; + // if (PhilosopherList[leftPhilosopher].state == EATING) + // return false; + // if (PhilosopherList[rightPhilosopher].state == EATING) + // return false; + for (int i = 0; i < philosopherTotal; i++) + if (PhilosopherList[i].state == EATING) + return false; return true; } diff --git a/DiningPhilosophers.out b/DiningPhilosophers.out index 2926701039a6b2ec7e09e410b92e601f36628e48..9fd69ad96877d536d68e352b2cf3b7ee56bfe150 100755 GIT binary patch delta 1685 zcmaJ?eN0JWX{=bRNFh61l-4eF=0c%2wA+CvJ{-Xw_OS+&AHdKb_^}P3>>ol>+%elXM&OP`1 z?!8IR2gvyV8PyP-P0PtYo0jGfht8!|N|!oZM;s)(&8E~zq(T0c(K|eS^OMgnFO4~l zbbN3y@@d1!&~kWCrPpVE4|z~n3khq%XyOe0Fvmumbe}0th=;hq3hCcGF8M8F2ZS{O zQKj%x-}E@a)Zxe-eg0~L7`!3Ao#x8mI1vUDe=&yAQmT~0beF-NXI4nrC^0N4Lc&V4 zTEoMI9x*(&{kwEY{xu8~%?r?kgk>?*u+l2-G8S)#(4UqlpjQmVhc2OE$v}$7_Y}y( zYISf5+xE&n>n8JSj4f=FXerpZN?9e1@BXbskjCAZUpO~39SLU}D@eZwon4l?`vM;a z%a3+S(V~gdf5NRlD#WGvg=fT2{ai?hi{7{xjEiJKByn+aP9>6<7?{w6vcyo2!pFp5 zOy*+>zX)C(;^ep&bh5Y7GrnH5(CTMeqMbs7Q_Q;wlV;!%7RRM=7!}eHQ&CYB_E(MxVb0!_)^0oz{h%9(hK8o8%kZGVfESCvN<;Y&%JW<3 z9<#whQn?>j7*kZ&S820(zpgeatjSHeq$f##Fza*fJ;b@bnEVi_(~zIptV!9UkRHg* z%dag_t}YXVIdf2zUZm1H1xk z1&V0&B+qT)0vMd5)3y>)O_ywDKJg3H*|(8q>b9FLO-MI{6dS)h3YTZ^l7Nsu_Hb&|#?dLsfU5YF|>7j-(xQ-fr%f*6c?0KGePUsXJx0 z6>|r{uYy00{K-9^7*qw+s&*bK$)g*Zr|vLz8{?#gznR=|2)u2XF;^;oH2p~_w;X&F z0yhLgs-RC^FY|Hmjo=4TdHzIlgGKP4(aFLG(y|cq+wgp$S4&?heV8{|!egaVDt>nn zebrq{+UTU)N&4uLdt~cqu4Kk>l?rgL!6S#y=8P6PR^}i#=zN)zXlZu2nJmy9V!;mTHXeD1wadXtmqyytn| z_kGSsZeM`)1z5ktOudqzeZ3OpF_$S}(8Giw(#Tv)u65{f5-BL&%#1+vKXv+rNRJ^mH)j&^pppnFiC{F=LSN=Nn2QeB3bzYKhdMF`)nfBXfN75h;DRH$&8MeDJcX9MvUY`}= zb3D?RzlH6)gyip3mp@<#aCD_y?G}yw@__UCcP~IH#HKNiDpRUr{>6}QEYviGS~Hrb z*kxoN8EV@RQl^5VC~(W970|uj_lyFh;PedH%^ zBDcp!Ut5cE`iv>wuF$l#YVFC?rM@N3b#tFTpkmwhqIPWa*e)FR9Gm#~-a9ivUmWwm z5Yq!Zg*Y|X)|bK)Ij>3OU)Jaj&CXX4oP|J16|}F~9Rq(6{P|Q~j3gUe2k*zh*QN3YSM#%Az8!p7 zD!)hNBjp>OG}10<6TMkgD|Xu=16892Fe%JdBok zqAYaVXkep@*=crTHIqp8SlP2w=BYMD&6-|lB)_M`DCg^uOeZ|gGaoH_eswr4`kHoZ zn2y3_p0Gw}vFhvRX?9bC(Y;)!fyy>NEiPCh?``gqSTPyvtFyb8O=(DO$xP4G*T8nL ZzS_9@mmaR)B2PH crashCompile.log -./DiningPhilosophers.out 5 +./DiningPhilosophers.out 5