Concorrência
Threads, atores, canais, travas, STM e processos — e a regra que decide qual: quem pode escrever neste estado?
A linguagem não sincroniza sozinha. Duas threads escrevendo na mesma variável perdem atualizações — medido: 40.425 de 80.000, calado. Toda ferramenta desta seção responde de um jeito à mesma pergunta: quem pode escrever neste estado, e quando?
adopt Arcane.Concurrent as P
// um ator: o estado mora numa thread, e as outras só enviam
contador := P.ator(lambda n, m: n + m, 0)
action somar_muito():
cycle i from 1 to 500:
contador.enviar(1)
parallel:
somar_muito()
somar_muito()
assert contador.parar() is 1000 // nenhuma atualização perdida| Resposta | Ferramenta | Página |
|---|---|---|
| ninguém: cada um tem o seu | variável por thread | Uma por thread |
| só um dono, por mensagem | ator | Atores |
| passa de mão em mão | canal | Canais |
| qualquer um, um de cada vez | mutex, semáforo | Travas |
| qualquer um, junto ou nada | STM | Memória transacional |
| ninguém compartilha memória | processos | Processos |
Atores
estado com dono, alcançado por mensagem
Canais entre threads
o produtor que espera, e o fechar
Travas
mutex, semáforo, leitura e escrita
Condição de corrida
o ler-somar-escrever, medido
Impasse
duas travas em ordens diferentes
Processos
o único caminho para mais de um núcleo
Padrões
produtor-consumidor, pool, espalhar e juntar
Memória transacional
escritas que acontecem juntas
Atômicos e sem trava
contador, anel e pilha
Laço, thread, async ou processo
qual modelo para qual trabalho
Concorrência: o mapa
o que existe, e o que não