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