SICP Concurrency Language
SICP Concurrency Language
=========================
Danny Yoo ([email protected] / [email protected])
Index terms: _sicp_ _concurrency_ _sicp-concurrency_
Introduction
============
This provides primitives for doing concurrency, meant to be used with
material from The Structure and Interpretation of Computer Programs
(SICP) Chapter 3.4.
http://mitpress.mit.edu/sicp/full-text/book/book-Z-H-23.html#%_sec_3.4
After this PLaneT module is locally installed and DrScheme is
restarted, a new language level called SICP Concurrency should be
selectable. Alternatively, the provided module "sicp-concurrency.ss"
can be used as a module language.
Example usage
=============
(module test-concurrency
(planet "sicp-concurrency.ss" ("dyoo" "sicp-concurrency.plt"))
(define (test-1)
(define x 10)
(parallel-execute (lambda () (set! x (* x x)))
(lambda () (set! x (+ x 1))))
x)
(define (test-2)
(define x 10)
(define s (make-serializer))
(parallel-execute (s (lambda () (set! x (* x x))))
(s (lambda () (set! x (+ x 1)))))
x))
This example comes from SICP Section 3.4.2 (Mechanisms for Controlling
Concurrency). If we run TEST-1 for multiple rounds, we'll see several
different and surprising values depending on the interleaving that
happens with PARALLEL-EXECUTE. TEST-2, on the other hand uses a
serializer to protect the respective critical regions.
API for (planet "sicp-concurrency.ss" ("dyoo" "sicp-concurrency.plt"))
======================================================================
This module language provides everything that mzscheme provides,
except for:
#%app
#%datum
set!
which are replaced with custom version of these to cause more
interesting concurrency interactions.
We extend the language with following primitives:
> parallel-execute: thunks* -> void
Evaluates any number of thunks in parallel. The scheduler runs in
round-robin order. There are no guarantees on how context is switched
between the evaluated thunks.
> make-serializer: -> (thunk -> void)
Constructs a serializer that consumes a thunk and evaluates it
atomically.
> test-and-set!: (cons boolean X) -> boolean
Given a "cell" whose CAR is a boolean, atomically tests the cell. As
in SICP, it evaluates to whatever the content of the cell is, but if
it was originally #f, sets it to #t.
Thanks
======
Thanks to Jens Axel Sooegard, for pretty much writing the hard stuff
in this module. Most of this is taken from his work; I just added a
nice language package for this. Also thanks to the PLT team for a
nice programming environment.