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