//------------------------------------------------------------------------ // Filename: // ProducerConsumer-Thrd.cpp // PROGRAM DESCRIPTION // Class implementation file for Producer and // consumer thread class. //------------------------------------------------------------------------ #include #include "ThreadClass.h" #include "ProducerConsumer-Thrd.h" #include "ProducerConsumer-mon.h" // static data variable static BufferMonitor BoundedBuffer("BounderBuffer"); // ----------------------------------------------------------------------- // FUNCTION Filler(): // This function fills a strstream with spaces. // ----------------------------------------------------------------------- strstream *Filler(int n) { int i; strstream *Space; Space = new strstream; for (i = 0; i < n; i++) (*Space) << ' '; (*Space) << '\0'; return Space; } //------------------------------------------------------------------------ // ProducerThread::ProducerThread() // constructor for ProducerThread class //------------------------------------------------------------------------ ProducerThread::ProducerThread(int No, int numberofdata) : Number(No), NumberOfData(numberofdata) { ThreadName.seekp(0, ios::beg); ThreadName << "Producer" << No << '\0'; }; //------------------------------------------------------------------------ // ProducerThread::ProducerThread() // constructor for ProducerThread class //------------------------------------------------------------------------ ConsumerThread::ConsumerThread(int No) : Number(No) { ThreadName.seekp(0, ios::beg); ThreadName << "Consumer" << No << '\0'; } //------------------------------------------------------------------------ // ProducerThread::ThreadFunc() // producer thread implementation //------------------------------------------------------------------------ void ProducerThread::ThreadFunc() { Thread::ThreadFunc(); int data; strstream *Space; Space=Filler(4); for (int i = 1; i <= NumberOfData; i++) { Delay(); data = rand() % 100 + 1000 * Number; // generate data BoundedBuffer.Put(data); // add data to the buffer cout << Space->str() << ThreadName.str() << " put " << data << " to the buffer" << endl; } Delay(); // about to add END BoundedBuffer.Put(END); // put the END message in cout << Space->str() << ThreadName.str() << " deposited END and Exit" << endl; Exit(); } //------------------------------------------------------------------------ // ConsumerThread::ThreadFunc() // consumer thread implementation //------------------------------------------------------------------------ void ConsumerThread::ThreadFunc() { Thread::ThreadFunc(); int data = 0 ; strstream *Space; Space=Filler(2); while (true) { Delay(); BoundedBuffer.Get(&data); // get a data item from the buffer if (data != END) { // If it is not "END" cout << Space->str() << ThreadName.str()<< " received " << data << " from the buffer" << endl; } else { cout << Space->str() << ThreadName.str() << " received END and exits" << endl; break; } } Exit(); } // end of ProducerConsumer-Thrd.cpp