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(); }