# 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


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://concorrencia101.leandronsp.com/parte-ii-concorrencia-em-diferentes-linguagens/concorrencia-em-c/modelo-de-atores.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
