Я написал производителя-потребителя следующим образом:
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)
.Это прекрасно работает.
Что-то не так с этим подходом?Я что-то пропустил?