[threads-standard-discuss] MP standardization proposal

Robert Strandh strandh at labri.fr
Tue Jul 13 05:08:55 UTC 2004


I am having a hard time understanding condition variables. 

> * Resource contention: condition variables
> 
> A condition variable is a queue of processes which are waiting for
> some event.  When the event occurs, the queue will be notified,
> causing one or more of the stopped processes to be resumed.

What determines whether one or more than one process gets resumed? 

Since it is a queue (FIFO), is the first process in always resumed? 

> Condition variables are used to signal events when the state of some
> shared resource changes: for example, consider a buffer with readers
> and a writer, where the readers can only run when there is data in the
> buffer, and the writer can only refill the buffer when it is empty.

OK, I follow this far. 

> By providing an atomic "release lock and sleep" operation, a condition
> variable guards against the "lost notification" problem, which is
> where the writer adds data to the buffer in between the time that a
> reader tests it (finding it empty) and goes to sleep.

I do not see how having a "release lock and sleep" operation fixes the
"lost notification" problem.  Who would use the operation?  The reader
or the writer or both?  

> make-condition-variable () [function]
> 
> Returns a new condition-variable object for use with CONDITION-WAIT
> and CONDITION-NOTIFY.
> 
> condition-wait (condition-variable lock)  [function]
> 
> Atomically release LOCK and enqueue the calling process waiting for
> CONDITION-VARIABLE.  The process will resume when another thread has

You probably mean `process' as opposed to `thread'. 

> notified it using CONDITION-NOTIFY, or we are interrupted, 

How would we get interrupted?

> or in other
> implementation-dependent circumstances: the caller must always test
> on waking that it can proceed, before continuing normal processing.

How does it test that it can proceed?  Doesn't that test reintroduce
the problem that condition-variables were designed to avoid? 

> However and for whatever reason the process is resumed, the system
> always reacquires LOCK before returning to the caller.  It is an error
> to call this unless from the thread that holds LOCK.
> 
> In an implementation that does not support multiple processes, this
> function signals an error.
> 
> condition-notify (condition-variable)  [function]
> 
> Notify one or more of the processes waiting for CONDITION-VARIABLE.
> The caller needs to acquire the lock associated with the condition
> variable before calling this.

There has been no mention of "lock associated with condition variable"
before.  How is this association determined? 

> In an implementation that does not support multiple processes, this
> function has no effect.


-- 
Robert Strandh

---------------------------------------------------------------------
Greenspun's Tenth Rule of Programming: any sufficiently complicated C
or Fortran program contains an ad hoc informally-specified bug-ridden
slow implementation of half of Common Lisp.
---------------------------------------------------------------------






More information about the Threads-standard-discuss mailing list