Programação concorrente

Registar um processo

Até aqui para enviarmos uma mensagem a um dado processo necessitavamos de saber o seu Pid. Em muitos casos isso pode não ser prático nem desejável, como por exemplo, num sistema com vários servidores, ou sempre que um processo, por razões de segurança ou de implementação, pretenda esconder a sua identidade.

O Erlang permite registar um processo com um nome único no sistema  (o nome terá, necessariamente, de ser um átomo). Assim, para registar um processo com um dado nome é usada a primitiva register:

register(Nome,Pid)

Passa a ser possível comunicar com esse processo usando o seu nome. A primitiva send (!) aceita nomes de processos como identificador do destinatário da mensagem a enviar. Obviamente, continua a ser possível enviar mensagens usando o Pid do processo como identificador do destinatário.

Algumas primitivas básicas para lidar com processos registados:


Exercícios

1) Implemente um modelo cliente/servidor responsável pela gestão de contas bancárias. O processo servidor deve ser registado com o nome "banco". Deverão ser criadas as seguintes funções para o cliente:

Não são permitidas duas contas para o mesmo cliente. Não é possível levantar um montante superior ao saldo actual. Todas as funções devem devolver {Resultado,Valor}, em que Resultado pode ser 'erro' ou 'ok' e Valor a mensagem correspondente.


2) Implementar um sistema, constituído por 4 processos, que resolva o seguinte somatório:

16-09-99(formula).gif (1450 bytes)

O sistema deverá ser descrito, no que respeita às mensagens transaccionadas, da seguinte forma:

  1. O primeiro processo recebe do cliente uma lista de valores inteiros a calcular e envia, elemento a elemento, ao segundo processo as seguintes mensagens: {valor,Xi,I } ou fim
    Quando receber do quarto processo o resultado final envia ao cliente {resultado,Resultado}
  2. O segundo processo envia para o terceiro processo {valor,I} e para o quarto processo {valor,Xi2}
  3. O terceiro processo envia para o quarto processo {valor,I2}
  4. O quarto processo envia para o primeiro {valor,Soma_de_todos_os_valores_recebidos*3} quando receber a mensagem fim