Еще один производитель - потребитель C ++ - PullRequest
0 голосов
/ 28 мая 2018

Я написал производителя-потребителя следующим образом:

void producer(int n)
{
    std::unique_lock<std::mutex> lock(mtx);
    for (int i = 0; i < n; ++i) 
    {
        cv.wait(lock, [] {return !notified; });
        std::cout << "Producing.." << i << std::endl;
        Q.push(i);
        notified = true;
        cv.notify_one();
    }
    done = true;
}

void consumer()
{
    std::unique_lock<std::mutex> lock(mtx);
    while (!done) 
    {
        cv.wait(lock, [] {return notified; });
        while (!Q.empty()) 
        {
            std::cout << "Consuming.." << Q.front() << std::endl;
            Q.pop();
            cv.notify_all();
            notified = false;
        }
    }
}

int main()
{
    auto fut1 = std::async(producer, 20);
    auto fut2 = std::async(consumer);
    fut1.get();
    fut2.get();
    system("pause");
}

Это я считаю редкой версией (сделанной дома ^ _ ^), отличие от хорошо известных источников, таких как cppreference заключается в том, что в производителе я не заставляю поток спать, вместо этого я жду уведомления от потребителя, а в потребителе я не заключаю cv.wait в цикл while(!notified).Это прекрасно работает.
Что-то не так с этим подходом?Я что-то пропустил?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...