Pular para o conteúdo

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
TravaDeixa passarUso
P.mutex()uma thread por vez (reentrante)proteger um estado compartilhado
P.semaforo(n)até N ao mesmo tempolimitar conexões a um serviço externo
P.trava_leitura_escrita()muitos leitores, ou um escritorcache lido o tempo todo e escrito raramente
P.com_trava(trava, acao)toma, roda, e solta mesmo com erro