Simple but Strange Optimistic Concurrency Example

Mark S. Miller markm@caplet.com
Fri, 05 Feb 1999 00:14:06 -0800


Inspired by a similar example in Flat Concurrent Prolog.  Enjoy.

? define QMaker() {
>     define [qtail, qhead] := PromiseMaker()
>     define cons(elem, next) {
>         define pair {
>             to getElem { elem }
>             to getNext { next }
>         }
>     }
>     [define enqueue(elem) {
>         define [nextTail, nextHead] := PromiseMaker()
>         qhead resolve(cons(elem, nextTail))
>         qhead := nextHead
>         null
>     },
>     define dequeue() {
>         define result := qtail <- getElem
>         qtail := qtail <- getNext
>         result
>     }]
> }
# value: <QMaker>

? define [enq, deq] := QMaker()
# value: [<enqueue>, <dequeue>]

? enq(3)

? def a1 := deq()
# value: <Deferred ref>

? define a2 := deq()
# value: <Deferred ref>

? a1
# value: 3

? a2
# value: <Deferred ref>

? enq(4)

? a2
# value: 4