#pragma once #include "monitor.h" #include #include template class Producer : public QThread { private: static QSemaphore numProducts; int ID; static Monitor *mon; public: static T (*produce)(int); static void initClass(int numP, Monitor *m, T(*prod)(int)) { mon = m; numProducts.release(numP); produce = prod; }; Producer(int i) : ID(i) {}; Producer(QObject *parent, int id); void run() { while (numProducts.tryAcquire()) { // While not all numProducts items are produced: T item = (*produce)(ID); // Produce one item T *aux = mon->canPut(); // Get place for item in emptySpotsQ *aux = item; // Put item into emptySpotsQ mon->donePutting(aux); // Give info to consumer threads } }; }; template QSemaphore Producer::numProducts; template Monitor * Producer::mon; template<> int (*Producer::produce)(int) = NULL;