You need to lock the mutex to synchronize access to the shared data. On Jul 27, 2012, at 2:31 PM, Minas Mina <minas_mina1...@hotmail.co.uk> wrote: > > class Monitor > { > Cond cond; Mutex mutex;
> > char[] buffer; > ulong sz; > > this() > { > // necessary: The condition variable constructor requires a > mutex passed to it mutex = new Mutex; cond = new Cond(mutex); > } > > void produce() > { > // produce a letter a-z > char c = 'a' + rand() % 26; > writeln("* Producer: Produced a '", c, "' buffer.length = ", > buffer.length, "\n"); synchronized(mutex) { > > // put it into the buffer > ++buffer.length; > buffer[buffer.length - 1] = c; > > //if( buffer.length > 1 ) > notify(cond); // calls condition.notify() } > > //Thread.sleep(dur!"msecs"(1000)); > } > > void consume() > { synchronized(mutex) { // note changed if to while > while( buffer.length == 0 ) > { > writeln("put to sleep"); > cwait(cond); // calls Condition.wait() > } > > // take > char c = buffer[buffer.length-1]; > --buffer.length; } > Also, is there a function that I can call to immediatly suspend the running > thread? Thread.yield(). Though Cond.wait() will suspend the thread as well.