6.6 Задачата за обядващите философи
Пет философа прекарват живота си в мислене и ядене.
Те седят около кръгла маса, на която има 5 чинии със спагети и 5 вилици.
Когато мисли, философ не контактува с колегите си. От време на време огладнява
и се опитва да вземе (последователно!) двете вилици, които са от двете
стране на чинията му. Ако успее, той започва да яде с двете вилици,
а след като свърши с яденето, връща вилиците и започва да мисли отново.
Първи опит за тривиално решение със семафори.
/* program dining_philosophers */
semaphore fork[5] = {1,1,1,1,1};
int i;
void philosopher(int i)
{
while(true)
{
think;
wait(fork[i]);
wait(fork[(i+1)%5]);
eat;
signal(fork[(i+1)%5]);
signal(fork[i]);
}
{
void main()
{
parbegin(philosopher(0), philosopher(1),
philosopher(2), philosopher(3),
philosopher(4));
}
Втори опит - решение със семафори:
/* program dining_philosophers */
semaphore fork[5] = {1,1,1,1,1};
semaphore room = 4;
int i;
void philosopher(int i)
{
while(true)
{
think;
wait(room);
wait(fork[i]);
wait(fork[(i+1)%5]);
eat;
signal(fork[(i+1)%5]);
signal(fork[i]);
signal(room);
}
}
void main()
{
parbegin(philosopher(0), philosopher(1),
philosopher(2), philosopher(3),
philosopher(4));
}