C++ 另一个生产者——消费者,C++;

C++ 另一个生产者——消费者,C++;,c++,multithreading,c++11,concurrency,producer-consumer,C++,Multithreading,C++11,Concurrency,Producer Consumer,我写了《生产者-消费者》如下: 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;

我写了《生产者-消费者》如下:

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");
}
void生产者(int n)
{
std::唯一锁(mtx);
对于(int i=0;istd::您唯一真正遗漏的是,如前所述,队列中最多只能有一个对象。生产者在消费者消费其生产的第一个元素之前不会生产另一个元素。正确,这就是这个问题的全部含义吗?不完全是。一般来说,生产者和消费者独立于each其他。如果生产者可以临时以比消费者更快的速度生产东西,它应该这样做。这就是独立执行线程存在的全部原因。否则这里没有真正的理由有线程。只需在单个执行线程中生产一个值,然后消费它,然后生产下一个值。实际上,它不是。你为什么要这样做如果只有一个元素,就使用队列?哦,我现在看到@SamVarshavchik,完整的定义是:问题描述了两个进程,生产者和消费者,他们共享一个通用的固定大小的缓冲区作为队列。生产者的任务是生成数据,将其放入缓冲区,然后重新开始。同时,消费者是一个不稳定的角色一次一块地删除数据(即从缓冲区中删除数据)。问题是确保生产者不会在缓冲区已满时尝试将数据添加到缓冲区中,消费者也不会尝试从空缓冲区中删除数据。