> For the complete documentation index, see [llms.txt](https://concorrencia101.leandronsp.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://concorrencia101.leandronsp.com/parte-ii-concorrencia-em-diferentes-linguagens/concorrencia-em-c/modelo-de-atores.md).

# Modelo de Atores

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.&#x20;

E se quisermos utilizar threads sem compartilhar memória, é possível? Sim, através da técnica de **modelo de atores**.

## O quê é um ator?

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.

<figure><img src="/files/AaQTARJmJ2oMM2LiyxHy" alt="" width="563"><figcaption></figcaption></figure>

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.

## Trabalhando com atores em C

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](https://github.com/airplug/libactor): uma implementação de modelo de atores que utiliza **pthreads**
* [czmq/zactor](https://github.com/zeromq/czmq?tab=readme-ov-file#zactor---simple-actor-framework): implementação de ator utilizando os building blocks do ZeroMQ
