//philosopher void *philosopher(void *id) { for(;;){ //extract the id passed to the philosopher function int idt = (long long int)id; //print out required text printf("Philosopher %d is is thinking\n", idt);fflush(stdout); napping(MAX_NAP_T1); printf("Philosopher %d is is hungry\n", idt);fflush(stdout); //acquire chopstick to left pthread_mutex_lock(&chopsticks[idt]); printf("Philosopher %d picking up chopstick %d\n", idt, idt);fflush(stdout); napping(MAX_NAP_T1); //acquire chopstick to right pthread_mutex_lock(&chopsticks[(idt+1) % 5]); printf("Philosopher %d picking up chopstick %d\n", idt, (idt+1) % 5); fflush(stdout); //acquire chip printf("Philosopher %d is is starting to eat\n", idt);fflush(stdout); napping(MAX_NAP_T2); printf("Philosopher %d is is done eating\n", idt); fflush(stdout); //release chopstick to left pthread_mutex_unlock(&chopsticks[idt]); printf("Philosopher %d putting down chopstick %d\n", idt, idt); fflush(stdout); napping(MAX_NAP_T1); //release chopstick to right pthread_mutex_unlock(&chopsticks[(idt+1) % 5]); printf("Philosopher %d putting down chopstick %d\n", idt, (idt+1) % 5); fflush(stdout); } }
void * Philosopher (void *id){ //struct parm *param = (struct parm *)p; //int n = param->id; //pthread_mutex_t *chopsticks = param->chopsticks; long long n = (long long)id; while(1){ printf("Philosopher %lld is thinking.\n", n); napping(2); printf("Philosopher %lld is hungry.\n", n); if(n>((n+1)%5)){ // Tries to get chopsticks if(pthread_mutex_lock(&chopsticks[(n+1)%5])){ perror("Wait for mutex failed right"); exit(-1); } // napping to encourage deadlock to occur napping(1); if(pthread_mutex_lock(&chopsticks[n])){ perror("Wait for mutex failed left"); exit(-1); } }else{ // Tries to get chopsticks if(pthread_mutex_lock(&chopsticks[n])){ perror("Wait for mutex failed left"); exit(-1); } // napping to encourage deadlock to occur napping(1); if(pthread_mutex_lock(&chopsticks[(n+1)%5])){ perror("Wait for mutex failed right"); exit(-1); } } printf("Philosopher %lld is starting to eat.\n", n); napping(1); printf("philosopher %lld is done eating.\n", n); // Put down the chopsticks if(pthread_mutex_unlock(&chopsticks[n])){ perror("Unlock mutex failed left"); exit(-1); } if(pthread_mutex_unlock(&chopsticks[(n+1)%5])){ perror("Unlock mutex failed right"); exit(-1); } fflush(stdout); } pthread_exit(NULL); }
void* Philosopher(void *id){ while(1){ long long id2 = *(long long*)id; printf("Philosopher %llu is thinking\n",id2); napping(1); printf("Philosopher %llu is hungry\n", id2); pthread_mutex_lock(&chopsticks[(id2+1)%5]); printf("Philosopher %d picking up chopstick %d\n", id2, (id2+1)%5); pthread_mutex_lock(&chopsticks[(id2)%5]); printf("Philosopher %d picking up chopstick %d\n", id2, (id2%5)); printf("Philosopher %llu is starting to eat\n", id2); napping(2); printf("Philosopher %llu is done eating\n", id2); //adding napping to encourage deadlock napping(50000000); pthread_mutex_unlock(&chopsticks[(id2+1)%5]); printf("Philosopher %d putting down chopstick %d\n", id2, (id2+1)%5); napping(50000000); pthread_mutex_unlock(&chopsticks[(id2)%5]); printf("Philosopher %d putting down chopstick %d\n", id2, (id2)%5); } }