38 lines
1.1 KiB
C
38 lines
1.1 KiB
C
|
#pragma once
|
||
|
|
||
|
#include "monitor.h"
|
||
|
#include <QThread>
|
||
|
#include <QSemaphore>
|
||
|
|
||
|
template<typename T>
|
||
|
class Producer : public QThread {
|
||
|
private:
|
||
|
static QSemaphore numProducts;
|
||
|
int ID;
|
||
|
static Monitor<T> *mon;
|
||
|
public:
|
||
|
static T (*produce)(int);
|
||
|
|
||
|
static void initClass(int numP, Monitor<T> *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<typename T> QSemaphore Producer<T>::numProducts;
|
||
|
template<typename T> Monitor<T> * Producer<T>::mon;
|
||
|
template<> int (*Producer<int>::produce)(int) = NULL;
|