Esempio n. 1
0
//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);
  }
}
Esempio n. 2
0
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);
}	
Esempio n. 3
0
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);

  }
 }