Unreliable FIFO channel
A model of a point-to-point wire or of a broadcast LAN without bridging or switching
It preserves order and does not duplicate, but can lose messages at any time
VAR
q := Q{} % all initially empty
APROC Put(m) = << q := q + {m} >>
APROC Get() -> M = << VAR m | m = q.head => q := q.tail; RET m >>
THREAD Lose() = DO << VAR q1, q2, m | q = q1 + {m} + q2 => q := q1 + q2 >> [*] SKIP OD