Autores: Yuri Ulisses dos Santos Baza Professor: Rodrigo Campiolo Universidade Tecnológica Federal do Paraná - UTFPR
O problema do Papai Noel é um problema clássico de sincronização de threads que foi proposto por John Trono em 1994. O problema é baseado na história do Papai Noel e seus ajudantes elfos e renas. O problema é composto por três tipos de threads: Papai Noel, Elfo e Rena. O Papai Noel dorme até que um dos seguintes eventos ocorra:
- Quando 3 elfos estão na sala de espera esperando ajuda para montar os brinquedos.
- Quando 9 renas estão na sala de espera esperando para puxar o trenó.
O objetivo deste projeto é implementar o problema do Papai Noel utilizando uma linguagem de programação. O projeto foi desenvolvido para a disciplina de Programação Concorrente do curso de Ciência de Computação da Universidade Tecnológica Federal do Paraná - UTFPR.
A linguagem escolhida para a implementação do projeto foi a linguagem de programação Elixir. A escolha da linguagem foi feita devido a sua facilidade de implementação de concorrência e paralelismo. Ainda, a linguagem foi desenvolvida por José Valim, um brasileiro que é conhecido por ser um dos principais contribuidores da linguagem Ruby.
Para executar o projeto, recomenda-se que sejam seguidos os seguintes passos (os passos foram testados no sistema operacional MacOS Sonoma 14.7):
# Instalar as dependências do gerenciador asdf
brew install coreutils curl git
# Instalar o gerenciador de versões asdf
brew install asdfApós a instalação do asdf, é necessário adicionar o seguinte trecho de código no arquivo ~/.zshrc ou ~/.bashrc:
# Adicionar o asdf no PATH
echo -e "\n. $(brew --prefix asdf)/asdf.sh" >> ${ZDOTDIR:-~}/.zshrcApós o passo anterior, é necessário instalar o plugin do Erlang e Elixir no asdf:
# Instalar o plugin do Erlang
asdf plugin add erlang
# Instalar o erlang
asdf install erlang latest
# Instalar o plugin do Elixir
asdf plugin add elixir
# Instalar o elixir
asdf install elixir latest
# Definir a versão do Erlang e Elixir
asdf set erlang <version>
asdf set elixir <version>Para saber os passos de instalação do asdf em outros sistemas operacionais, recomenda-se a leitura da documentação oficial do asdf: https://asdf-vm.com/pt-br/guide/getting-started.html
Para executar o projeto, recomenda-se que esteja com o código na sua máquina e seja seguido os seguintes passos:
iex santa_claus.exForam implementadas 3 mdoulos principais no código:
PapaiNoel: Módulo responsável por controlar o comportamento do Papai Noel.Elfo: Módulo responsável por controlar o comportamento dos elfos.Rena: Módulo responsável por controlar o comportamento das renas.
Também foi implementada uma função para inicializar o comportamento do Papai Noel, Elfo e Rena. A função start.
Ainda, temos:
santa nº 1: Função responsável por controlar o comportamento do Papai Noel quando há 9 renas na sala de espera.santa nº 2: Função responsável por controlar o comportamento do Papai Noel quando há 3 elfos na sala de espera.santa nº 3: Função responsável por esperar e processar as mensagens enviadas pelos elfos e renas.loop nº 1: Função responsável por controlar o comportamento dos elfos.loop nº 2: Função responsável por controlar o comportamento das renas.
Para finalizar, há algumas funções importantes utilizadas para concorrência em Elixir:
spawn: Função responsável por incializar um processo concorrente.send: Função responsável por enviar uma mensagem para um processo. Essa função é formada por dois argumentos: o primeiro é o processo que receberá a mensagem e o segundo é a mensagem que será enviada.receive: Função responsável por receber uma mensagem enviada por um processo. Essa função é formada por um bloco de código que será executado quando uma mensagem for recebida.
O código foi desenvolvido de forma a ser o mais simples possível, para que seja possível entender o funcionamento do problema do Papai Noel. Ainda, o código foi inteiramente comentado para facilitar o entendimento.
- José Valim: https://pt.wikipedia.org/wiki/Jos%C3%A9_Valim
- Site oficial do Elixir: https://elixir-lang.org/
- Site oficial do asdf: https://asdf-vm.com/
- Concorrência em Elixir: https://elixirschool.com/pt/lessons/intermediate/concurrency