/* Uppgiften är att synkronisera koden och undvika alla "busy-wait" som kan uppstå. Din lösning ändrar eller ersätter relevant kod med att använda lås och semaforer (conditions om du vill). Det finns: - Tio filosofer. - Ett runt bord med fem platser. - En skål mat i mitten på bordet. - Två servitörer som med jämna mellanrum fyller på skålen. - En tallrik per plats och en gaffel mellan varje plats. Krav: - Varje filosof behöver en plats, vilken som. - En filosof behöver just de gafflar som finns på vardera sida om platsen. - Det går inte att ta mat om skålen är tom. - Är skålen tom lämnar filosofen bordet omedelbart. - En filosof skall kunna äta samtidigt som de andra filosoferna. Tänk även på att undvika deadlock! */ void cook_more_rations(void) NO_STEP {} void eat_randomly_long_time(void) NO_STEP {} void sleep_randomly_long_time(void) NO_STEP {} bool seat_taken[3]; bool fork_taken[3]; int rations_of_food; void init() // executed before threads { for (int i = 0; i < 5; ++i) { seat_taken[i] = false; fork_taken[i] = false; } rations_of_food = 0; } void clerk_thread() { for (int i = 0; i < 10; i++) { // Add more food to table rations_of_food = rations_of_food + 1; cook_more_rations(); } } void philosopher_thread() { for (int i = 0; i < 3; i++) { int seat_no = 0; // Find a free seat. while ( seat_taken[seat_no] ) seat_no = (seat_no + 1) % 3; seat_taken[seat_no] = true; // Grab two forks. int fork1 = seat_no; int fork2 = (seat_no + 1) % 3; while ( fork_taken[fork1] ) ; fork_taken[fork1] = true; while ( fork_taken[fork2] ) ; fork_taken[fork2] = true; // Check for food. Eat, or leave hungry. if (rations_of_food > 0) { rations_of_food = rations_of_food - 1; eat_randomly_long_time(); } // Replace forks and leave seat. fork_taken[fork1] = false; fork_taken[fork2] = false; seat_taken[seat_no] = false; // Digest the food. sleep_randomly_long_time(); } } int main(void) { thread_new(&philosopher_thread); thread_new(&philosopher_thread); thread_new(&philosopher_thread); thread_new(&philosopher_thread); clerk_thread(); return 0; }