aca-tasks/MonitorExample/consumer.cpp

27 lines
1004 B
C++
Raw Normal View History

#include "consumer.h"
template<typename T> QSemaphore Consumer<T>::numProducts;
template<typename T> Monitor<T> *Consumer<T>::mon;
template<> void (*Consumer<int>::consume)(int, int) = NULL;
//---------------------------------------
template<typename T> void Consumer<T>::initClass(int numP, Monitor<T> *m, void (*cons)(T, int)) {
numProducts.release(numP);
mon = m;
consume = cons;
}
//---------------------------------------
2023-12-02 14:29:28 +00:00
//Semaphore with Number of Resources -> consume N Resources
//get spot of item in queue, take item, activate producers
//process item
template<typename T> void Consumer<T>::run() {
while (numProducts.tryAcquire()) { // While not all numProducts are consumed:
T* aux = mon->canGet(); // Get pointer to item in itemQ
T item = *aux; // Take the item out of itemQ
mon->doneGetting(aux); // Give info to producer threads
(*consume)(item,ID); // Consume one item
}
}
//---------------------------------------