W systemie jeden wątek piszący wstawia obiekty do kolejki (obiekt typu Queue), do którego wstawia dane jeden wątek. Ilość danych w kolejce jest duża i rośnie, więc zwiększono ilość wątków przetwarzających dane. Wątki te wykonują funcję calc_thrd. Niestety nie obserwuje się poprawy.
#include <queue>
#include <memory>
#include <thread>
#include <mutex>
#include <iostream>
using namespace std;
class Data {}; //nie zamieszczono skladowych
using PData = shared_ptr<Data>;
struct Queue {
Queue() {}
bool empty() {
lock_guard<mutex> guard(m_);
return q_.empty();
}
void push(PData data) {
lock_guard<mutex> guard(m_);
q_.push(data);
}
PData pop() {
PData out;
lock_guard<mutex> guard(m_);
if(!q_.empty()) {
out = q_.front();
q_.pop();
}
return out;
}
mutex m_;
std::queue<PData> q_;
};
void calculate(const Data& d) { //dlugotrwale obliczenia
cout << "calculations begin" << endl;
this_thread::sleep_for( chrono::milliseconds(1000) );
cout << "calculations end" << endl;
}
void calc_thrd(Queue& q) {
while(!q.empty()) {
lock_guard<mutex> guard(q.m_);
calculate(*q.q_.front());
q.q_.pop();
}
}
int main() {
Queue q;
//pominięto wątek do wstawiania obiektów PData do kolejki q
q.push(PData(new Data()));
q.push(PData(new Data()));
q.push(PData(new Data()));
q.push(PData(new Data()));
q.push(PData(new Data()));
//tutaj wątki, które pobierają i przetwarzają obiekty PData z kolejki
thread thrd1( calc_thrd, ref(q) );
thread thrd2( calc_thrd, ref(q) );
thread thrd3( calc_thrd, ref(q) );
thread thrd4( calc_thrd, ref(q) );
thread thrd5( calc_thrd, ref(q) );
thrd1.join();
thrd2.join();
thrd3.join();
thrd4.join();
thrd5.join();
}