19. Конкуренция: "мъртва хватка" и "гладна смърт"
Задачата за обядващите философи.

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));
}