* 3.4 Concurrency: Time Is of the Essence when you allow local state not only the expression matters--so does the /time/ it was executed computers are largely sequential; concurrency complicates things ** 3.4.1 the nature of time in concurrent systems "time is a device that was invented to keep everything from happening at once" when multiple actions share state vars, you can have race conditions. ** 3.4.2 mechanisms for controlling concurrency a practical approach for managing time is to design mechanisms that can constrain the interleaving of concurrent processes. many have been developed. one of them is the /serializer/. - serialization :: processes execute concurrently, but there are collections of procedures that cannot serialization creates distinguished sets of procedures such that only one procedure in a set can be executed at a time. concurrent gets much harder when there are multiple shared resources IMPLEMENTING SERIALIZERS we implement serializers with a /mutex/ a mutex is an object that supports two operations: - a mutex can be /acquired/ - a mutex can be /released/ once a mutex is acquired, no one else can acquire until it's released. "mutex" stands for *mutual exclusion*. they name check dijkstra! #+BEGIN_SRC scheme (define (make-serializer) (let ((mutex (make-mutex))) (lambda (p) (define (serialized-p . args) (mutex 'acquire) (let ((val (apply p args))) (mutex 'release) val)) serialized-p))) #+END_SRC the mutex is a mutable obj that can hold true or false. when it is false, the mutex can be acquired. when it is true, the process trying to acquire the mutex must wait. #+BEGIN_SRC scheme (define (make-mutex) (let ((cell (list false))) (define (the-mutex m) (cond ((eq? m 'acquire) (if (test-and-set! cell) (the-mutex 'acquire))) ; retry ((eq? m 'release) (clear! cell)))) the-mutex)) (define (clear! cell) (set-car! cell false)) (define (test-and-set! cell) (if (car cell) true (begin (set-car! cell true) false))) #+END_SRC this implementation of test-and-set! is insufficient. see text for details. DEADLOCK if you try to switch A with B while someone else tries to switch B with A you might get a deadlock, where A is waiting for B and B is waiting for A and so nothing gets done CONCURRENCY, TIME, AND COMMUNICATION it is not clear, really, what "shared state" means this "state" thing is turning out to be one big headache this shit also comes up in the Theory of Relativity these complexities of concurrency seem to reflect a fundamental complexity of the universe.