// threadtest.cc // // ASSIGNMENT 4: (02/01/08, RD) // bounded buffer with 2 producer and 2 consumer threads #include "copyright.h" #include "system.h" #include "synch.h" // ASSIGNMENT 4 //---------------------------------------------------------------------- // bounded buffer //---------------------------------------------------------------------- class Buffer // ASSIGNMENT 4 { public: Buffer(char *name, int size); // constructor takes buffer size ~Buffer(void); // destructor char Get(void); // load a character void Put(char c); // store a character private: int isEmpty(void); // check if buffer is empty int isFull(void); // check if buffer is full char *BufferName; // name (useful for debugging) int Size; // size of the buffer char *Array; // array to store characters in buffer int n; // number of characters currently in buffer int PosGet; // next position for Get() int PosPut; // next position for Put() }; Buffer::Buffer(char *name, int size) // ASSIGNMENT 4 { BufferName = name; Size = size; Array = new char[size]; n = 0; PosGet = 0; PosPut = 0; } Buffer::~Buffer(void) // ASSIGNMENT 4 { delete[] Array; } char Buffer::Get(void) // ASSIGNMENT 4 { char c; c = Array[PosGet]; n--; PosGet = (PosGet+1) % Size; return c; } void Buffer::Put(char c) // ASSIGNMENT 4 { Array[PosPut] = c; n++; PosPut = (PosPut+1) % Size; } int Buffer::isEmpty(void) // ASSIGNMENT 4 { return(n == 0); } int Buffer::isFull(void) // ASSIGNMENT 4 { return(n == Size); } // Buffer instantiation // ASSIGNMENT 4 Buffer b("MyBuffer", 10); // Consumer Thread // ASSIGNMENT 4 void ConsumerThread(int id) { while (1) { printf("\t\t\tConsumer %d got a '%c'\n", id, b.Get()); } } // Producer Thread // ASSIGNMENT 4 void ProducerThread(int id) { static char *Text = "The quick brown fox jumps over the lazy dog."; char *p; p = Text; while (*p) { b.Put(*p); printf("Producer %d put a '%c'\n", id, *p); p++; } } //---------------------------------------------------------------------- // ThreadTest //---------------------------------------------------------------------- void ThreadTest() // ASSIGNMENT 4 { DEBUG('t', "Entering consumer/producer example"); // create consumer and producer threads Thread *cons1 = new Thread("Consumer1", 1); Thread *cons2 = new Thread("Consumer2", 2); Thread *prod1 = new Thread("Producer1", 1); Thread *prod2 = new Thread("Producer2", 2); cons1->Fork(ConsumerThread, 1); cons2->Fork(ConsumerThread, 2); prod1->Fork(ProducerThread, 1); prod2->Fork(ProducerThread, 2); // let this main thread terminate here }