W aplikacji występuje blokada. Wskaż przyczynę niepoprawnego działania i popraw błędny kod. Nie modyfikuj funkcji 'main'.

#include <list>
#include <thread>
#include <mutex>

#include <iostream>

using namespace std;

static const int NUM = 100;

/** klasa wejscia - wyjscia do kolejki znakow */
struct Queue {
    list<int> dane_;
    mutex mutex_;
};

struct Producent {

    Producent(Queue& in, Queue& out) : in_(in), out_(out) {}

    void operator()() {
        for(int num = 0; num < NUM; ) {
            lock_guard<mutex> lock_in(in_.mutex_);
            lock_guard<mutex> lock_out(out_.mutex_);
            if(!in_.dane_.empty() ) {
                int x = in_.dane_.front();
                in_.dane_.pop_front();

                cout << '.' << flush; //symuluje przetwarzanie danych

                out_.dane_.push_back(x+1);
                ++num;
            }
        }
    }
    Queue& in_;
    Queue& out_;
};

struct Producent2 {

    Producent2(Queue& in, Queue& out) : in_(in), out_(out) {}

    void operator()() {
        for(int num = 0; num < NUM; ) {
            int x = 0; //data
            bool read = false;
            {
                lock_guard<mutex> lock_in(in_.mutex_);
                if(!in_.dane_.empty() ) {
                    read = true;
                    x = in_.dane_.front();
                    in_.dane_.pop_front();
                }
            }
            if(read) {
                cout << '.' << flush; //symuluje przetwarzanie danych
                ++num;

                lock_guard<mutex> lock_out(out_.mutex_);
                out_.dane_.push_back(x+1);
            }
        }
    }
    Queue& in_;
    Queue& out_;
};

int main() {
    Queue q1, q2;
    q1.dane_.push_back(1);
    Producent p1(q1, q2);
    Producent p2(q2, q1);

    thread thrd1( ref(p1) );
    thread thrd2( ref(p2) );
    thrd1.join();
    thrd2.join();
    return 0;
}