Implementing a Monitor
Minas Mina
minas_mina1990 at hotmail.co.uk
Fri Jul 27 14:31:32 PDT 2012
I'm using condition variables to implement a monitor that
simulates the producer-consumer(unbounded buffer) scenario.
Note:
monitor is __gshared and is initialized in main(). Then the other
threads are created and run.
There is one producer thread, and 5 consumer threads.
void producer()
{
while( 1 )
{
monitor.produce();
}
}
void consumer()
{
while( 1 )
{
monitor.consume();
}
}
class Monitor
{
Cond cond;
char[] buffer;
ulong sz;
this()
{
// necessary: The condition variable constructor requires a
mutex passed to it
cond = new Cond(new Mutex());
}
void produce()
{
// produce a letter a-z
char c = 'a' + rand() % 26;
writeln("* Producer: Produced a '", c, "' buffer.length = ",
buffer.length, "\n");
// 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()
{
if( buffer.length == 0 )
{
writeln("put to sleep");
cwait(cond); // calls Condition.wait()
}
// take
char c = buffer[buffer.length-1];
--buffer.length;
writeln("# Consumer has taken a '", c, "' buffer = [", buffer,
"] (", buffer.length, " elements)\n");
}
}
The output is something like:
put to sleep
put to sleep
put to sleep
put to sleep
* Producer: Produced a 'n' buffer.length = 0
put to sleep
* Producer: Produced a 'w' buffer.length = 1
* Producer: Produced a 'l' buffer.length = 2
* Producer: Produced a 'r' buffer.length = 3
* Producer: Produced a 'b' buffer.length = 4
* Producer: Produced a 'b' buffer.length = 5
* Producer: Produced a 'm' buffer.length = 6
* Producer: Produced a 'q' buffer.length = 7
...
Even though the producer calls notify() when he finishes, none of
the consumer threads is ever resumed... (I ran the program for a
while and redirected output to a file. Then I searched for "#"
that the consumer prints but nothing).
Why is that happening? Is there something wrong with
Condition.notify()?
Also, is there a function that I can call to immediatly suspend
the running thread?
Thanks
More information about the Digitalmars-d-learn
mailing list