Modula-3: Thread interface

# The Thread interface

If a shared variable is written concurrently by two threads, or written by one and read concurrently by another, the effect is to set the variable to an implementation-dependent value of its type. For example, if one thread writes `a[0]` while another concurrently writes `a[1]`, one of the writes might be lost. Thus, portable programs must use the `Thread` interface to provide mutual exclusion for shared variables.

    INTERFACE Thread;

    TYPE
      T <: REFANY;
      Mutex = MUTEX;
      Condition <: ROOT;
      Closure = OBJECT METHODS apply(): REFANY END;

A `Thread.T` is a handle on a thread. A `Mutex` is locked by some thread, or unlocked. A `Condition` is a set of waiting threads. A newly-allocated `Mutex` is unlocked; a newly-allocated `Condition` is empty. It is a checked runtime error to pass the `NIL` `Mutex`, `Condition`, or `T` to any procedure in this interface.

    PROCEDURE Fork(cl: Closure): T;

A handle on a newly-created thread executing `cl.apply()`.

    PROCEDURE Join(t: T): REFANY;

Wait until `t` has terminated and return its result. It is a checked error to call this more than once for any `t`.

    PROCEDURE Wait(m: Mutex; c: Condition);

The calling thread must have `m` locked. Atomically unlocks `m` and waits on `c`. Then relocks `m` and returns.

    PROCEDURE Acquire(m: Mutex);

Wait until `m` is unlocked and then lock it.

    PROCEDURE Release(m: Mutex);

The calling thread must have `m` locked. Unlocks `m`.

    PROCEDURE Broadcast(c: Condition);

All threads waiting on `c` become eligible to run.

    PROCEDURE Signal(c: Condition);

One or more threads waiting on `c` become eligible to run.

    PROCEDURE Self(): T;

Return the handle of the calling thread.

    EXCEPTION Alerted;

Used to approximate asynchronous interrupts.

    PROCEDURE Alert(t: T);

Mark `t` as an alerted thread.

    PROCEDURE TestAlert(): BOOLEAN;

`TRUE` if the calling thread has been marked alerted.

    PROCEDURE AlertWait(m: Mutex; c: Condition) RAISES {Alerted};

Like `Wait`, but if the thread is marked alerted at the time of call or sometime during the wait, lock `m` and raise `Alerted`.

    PROCEDURE AlertJoin(t: T): REFANY RAISES {Alerted};

Like `Join`, but if the calling thread is marked alerted at the time of call or sometime during the wait, raise `Alerted`.

    CONST
      AtomicSize = ...;

An implementation-dependent integer constant: the number of bits in a memory-coherent block. If two components of a record or array fall in different blocks, they can be accessed concurrently by different threads without locking.

    END Thread.

    Last modified on Wed Apr  3 09:38:54 PST 1996 by heydon
         modified on Thu Jun  1 08:12:48 PDT 1995 by kalsow