Um problema clássico de sincronização é o do "Jantar dos Filósofos", que foi proposto em 1965 pelo matemático por Dijkstra (1965) e apresenta a seguinte caracterização:
Cinco filósofos estão sentados ao redor de uma mesa circular para o jantar. Cada filósofo possui um prato para comer. Os filósofos dispõem de hashis e cada um precisa de 2 hashis para comer. Entre cada par de pratos existe apenas um hashi, ou em termos de concorrência, hashis precisam ser compartilhados de forma sincronizada.
Os filósofos comem e pensam, alternadamente. Eles não se atém a apenas uma dastarefas. Além disso, quando comem, pegam apenas um hashi por vez: Se conseguir pegar os dois come por alguns instantes e depois larga os hashis.
O problema é coordenar o uso dos hashis de maneira que nenhum filósofo fique comfome. Esse problema exemplifica muito bem muitas soluções e muitos problemas encontrados na programação concorrente.
Pode facilmente ocorrer o deadlock se cada filósofo pegar o seu hashi da esquerda e se recusar a liberá-lo até ter comido. Pode ocorrer a inanição se dois filósofos conspirarem contra um terceiro.
Assim, uma implementação desse problema deve tratar o deadlock e usar ummecanismo de state para controlar o acesso a região crítica, que é o uso do hashi.
Em termos da programação, isso significa que teremos 5 objetos (filósofos) e 5 objetos compartilhados (os talheres). Nesse termo que entra o conceito de Thread pois para o compartilhamento múltiplos de objetos é necessária uma programação simultânea, ou seja, todos filósofos "vivos" e todos talheres manipuláveis.
Precisamos desenvolver as classes: Filosofo ( Representa os filósofos em si, e o que eles são capazes de fazer na mesa ), Semaforo ( Define uma propriedade para mostrar aos outro filósofos 0 se estiver livre para uso, 1 se estiver ocupado para uso ), Grade ( Que cria o ambiente e exibe na tela ) e JantarDosFilosofos ( Nosso método principal que implementa nossa Grade ). O nome do pacote é JANTARDOSFILOSOFOS.
Nenhum comentário:
Postar um comentário