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); } }
void * philosopher(void * para) { int mine = (int)para; int i = 0; while(i < 2) { i++; // usleep(mine); get_left_fork(mine); get_right_fork(mine); eat(); put_left_fork(mine); put_right_fork(mine); } printf("%d is finished\n", mine+1); return 0L; }
int acquire_forks(int p_id) { printf("\nAgent %d is acquiring forks\n", p_id); if(pthread_mutex_trylock(&fork[get_left_fork(p_id)]) && pthread_mutex_trylock(&fork[get_right_fork(p_id)])) { //acquired -- invoke eating printf("\nAyyy lmao, agent %d is obtaining forks\n", p_id); //printf("\nid %d, left fork %d, right fork %d\n", p_id, get_left_fork(p_id), get_right_fork(p_id)); return 1; } else { //already acquired by another agent -- return to thinking printf("\nAgent %d cannot obtain forks -- thinking\n", p_id); return 0; } }
void release_forks(int p_id) { pthread_mutex_unlock(&fork[get_left_fork(p_id)]); pthread_mutex_unlock(&fork[get_right_fork(p_id)]); }