/* the philosopher thread function - create N threads, each of which calls * this function with its philosopher number 0..N-1 */ void *philosopher_thread(void *context) { int philosopher_num = (int)context; /* hack... */ while (1) { sleep_exp(4.0); get_forks(philosopher_num); sleep_exp(2.5); release_forks(philosopher_num); } return 0; }
void run(int *i) { while (1) { sleep(1); if (eating[*i]) { printf("Philosopher #%d is eating 'yum yum'.\n", *i+1); release_forks(i); eating[*i] = 0; printf("Philosopher #%d released forks.\n", *i+1); } else { printf("Philosopher #%d is thinking.\n", *i+1); pthread_mutex_lock(&mutex); if (eating[*i] = look_for_forks(i)) printf("Philosopher #%d got his forks.\n", *i+1); pthread_mutex_unlock(&mutex); } } }
void eat(int p_id) { int result = acquire_forks(p_id); if(result == 1) { printf("\nAgent %d is eating\n", p_id); printf("\nForks %d and %d are locked!\n", get_left_fork(p_id), get_right_fork(p_id)); wait(generate_random_wait(p_id)); printf("OM NOM NOM NOM NOM NOM NOM"); release_forks(p_id); printf("\nForks %d and %d are unlocked!\n", get_left_fork(p_id), get_right_fork(p_id)); printf("Agent %d is mildly satisfied and is returning to the arts life\n", p_id); pthread_mutex_lock(&eat_lock); iterations++; printf("\niteration #%d\n", iterations); pthread_mutex_unlock(&eat_lock); think(p_id); } else { think(p_id); } }