Modelo de Atores
Last updated
Last updated
Outra forma de trabalhar com kernel threads que seja thread-safe, ou seja, utilizando threads de modo que não tenhamos problemas com condições de corrida, é através da implementação de modelo de atores.
Em tópicos anteriores vimos que a diferença entre processo e thread é que processos não compartilham memória, ao passo que threads compartiham memória. Isto por si só torna a utilização de processos segura em termos de race condition, mas com a desvantagem de utilizar bastante memória.
E se quisermos utilizar threads sem compartilhar memória, é possível? Sim, através da técnica de modelo de atores.
Um ator, no contexto de concorrência, é uma "thread" (ou unidade de concorrência) que tem algumas propriedades muito parecidas com um processo do sistema operacional:
não compartilha memória, ou seja, um ator tem seu próprio estado privado
possui identificação única no sistema
se comunica com outros atores através do envio de mensagens
As mensagens são enviadas para estruturas de fila, que usam aterminologia "inbox", ou caixa de entrada. Cada ator tem sua própria inbox para receber as mensagens.
Sendo assim, ao trabalhar com atores, não precisamos nos preocupar com uso de mutexes nem outro tipo de sincronização, pois somente o ator pode alterar seu próprio estado.
Para o nosso azar, o GCC não traz uma implementação padrão ou ferramental para trabalharmos com modelo de atores. Mas algumas bibliotecas externas implementam a técnica:
libactor: uma implementação de modelo de atores que utiliza pthreads
czmq/zactor: implementação de ator utilizando os building blocks do ZeroMQ