# First example: sem := CreateSemaphore(); f := function(l,c,k,n) local i; WaitSemaphore(sem); for i in [0..n-1] do l[1] := l[1]+1; l[l[1]] := c+k*i; od; end; g := function(l,c,k,n) local i; WaitSemaphore(sem); for i in [0..n-1] do l[l[1]+1] := c+k*i; l[1] := l[1]+1; od; end; h := function(l,c,k,n) local i; WaitSemaphore(sem); for i in [0..n-1] do atomic l do l[l[1]+1] := c+k*i; l[1] := l[1]+1; od; od; end; l := AtomicList([1]); SignalSemaphore(sem); f(l,1,1,1000); l[1]; FromAtomicList(l){[2..1001]}=[1..1000]; l := AtomicList([1]); SignalSemaphore(sem); g(l,1,1,1000); l[1]; FromAtomicList(l){[2..1001]}=[1..1000]; l := AtomicList([1]); t := [RunTask(f,l,1,5,1000), RunTask(f,l,2,5,1000), RunTask(f,l,3,5,1000), RunTask(f,l,4,5,1000), RunTask(f,l,5,5,1000)];; for i in [1..5] do SignalSemaphore(sem); od; Perform(t,WaitTask); ll := FromAtomicList(l); lll := Compacted(ll);; llll := Set(lll{[2..Length(lll)]});; Length(ll); ll[1]; Length(llll); llll; l := AtomicList([1]); t := [RunTask(g,l,1,5,1000), RunTask(g,l,2,5,1000), RunTask(g,l,3,5,1000), RunTask(g,l,4,5,1000), RunTask(g,l,5,5,1000)];; for i in [1..5] do SignalSemaphore(sem); od; Perform(t,WaitTask); ll := FromAtomicList(l); lll := Compacted(ll);; llll := Set(lll{[2..Length(lll)]});; Length(ll); ll[1]; Length(llll); llll; l := ShareObj([1]); t := [RunTask(h,l,1,5,1000), RunTask(h,l,2,5,1000), RunTask(h,l,3,5,1000), RunTask(h,l,4,5,1000), RunTask(h,l,5,5,1000)];; for i in [1..5] do SignalSemaphore(sem); od; Perform(t,WaitTask); atomic readonly l do ll := l{[2..Length(l)]}; od; Set(ll) = [1..5000]; # Second example: while true do a := 1; a := 2; od; !sh Collected(List([1..1000],i->a)); # Third example: a := ShareSpecialObj([1,2,3]);; b := ShareSpecialObj([1,2,3]);; c := CreateSemaphore(0); while true do atomic a do atomic b do a[1] := b[1]; od; od; SignalSemaphore(c); od; !sh c; c; c; c; while true do atomic b do atomic a do a[1] := b[1]; od; od; SignalSemaphore(c); od; !sh c; c; # Fourth example (for deadlock): r := NewRegion(); ch := CreateChannel(); wait := function() atomic r do return ReceiveChannel(ch); od; end; send := function(ob) atomic r do SendChannel(ch, ob); od; end; sem := CreateSemaphore(); while true do wait(); SignalSemaphore(sem); od; !sh while true do send([1,2,3]); SignalSemaphore(sem); od;