Travas
Mutex para um de cada vez, semáforo para N de cada vez, e com_trava para não esquecer de soltar.
Uma trava transforma um trecho em seção crítica: só uma thread por vez passa. É a ferramenta mais direta — e a que mais depende de disciplina: toda escrita no estado protegido precisa estar dentro dela, em todo lugar do programa.
dataforge
adopt Arcane.Concurrent as P
trava := P.mutex()
total := {"n": 0}
action somar_muito():
cycle i from 1 to 1000:
P.com_trava(trava, lambda => incrementar())
action incrementar():
total["n"] := total["n"] + 1
parallel:
somar_muito()
somar_muito()
assert total["n"] is 2000| Trava | Deixa passar | Uso |
|---|---|---|
P.mutex() | uma thread por vez (reentrante) | proteger um estado compartilhado |
P.semaforo(n) | até N ao mesmo tempo | limitar conexões a um serviço externo |
P.trava_leitura_escrita() | muitos leitores, ou um escritor | cache lido o tempo todo e escrito raramente |
P.com_trava(trava, acao) | — | toma, roda, e solta mesmo com erro |