O problema dos filósofos famintos
1.1 DEFINIÇÃO
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 macarrão.
•
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 das tarefas. •
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 com
fome. 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 um mecanismo de state para controlar o acesso a região crítica, que é o uso do hashi.
1.2 IMPLEMENTAÇÃO
Na implementação abaixo, utilizou-se a linguagem de programação Python, na versão estável 2.7, que possui nativamente a possibilidade de usar threads e outros conceitos da programação concorrente.
Abaixo percebe-se que o acesso à região critíca é controlado usando semáforos, também nativos da linguagem.
#-*-coding: utf-8 -*import thread import time, random import threading garfo = list() for i in range(5): garfo.append(threading.Semaphore(1)) def filosofo(f): f = int(f) while True:
# garfo da esquerda] garfo[f].acquire() # garfo da direita garfo[(f + 1) %