c ++线程生产者消费者

时间:2018-04-13 16:11:11

标签: c++ multithreading producer-consumer

我需要实施一个存钱罐模拟,客户可以从中存入或取款。客户端应表示为线程,而存储库是整数变量。我需要创建两个名为producer和consumer的函数,它们应该能够存入或取出由参数定义的数量。限制是消费者只有在存钱罐中有足够的钱时才应该退出。如果没有,它应该等待存钱罐填满。

消费者和生产者必须同时访问存钱罐,并添加或删除随机数量。

我遇到了麻烦。我是c ++和线程的新手。我看过不同的消费者生产者解决方案,但我找不到任何有用的东西。

到目前为止,这是我的代码。我认为结构是正确的,但是

 #include <iostream>
 #include <thread>
 #include <mutex>
 #include <condition_variable>

 using namespace std;

 int piggybank;
 mutex mlock;
 condition_variable sem;
 bool available = false;

 void consumer(int amount){
     unique_lock<mutex> lck(mlock);
     sem.wait(lck);
     piggybank -= amount;
 }

 void producer(int amount){
     unique_lock<mutex> lck(mlock);
     piggybank += amount;
     //available = piggybank > 50;
     sem.notify_all();
 }

 int main() {
     piggybank = 0;

     thread cons(consumer, rand()%50+1);
     thread prod(producer, rand()%50+1);

     prod.join();
     cons.join();

     return 0;
 } 

我需要某种条件,但我不知道如何使用条件变量。

1 个答案:

答案 0 :(得分:0)

您可能遇到的一个问题是:您的代码无法保证消费者在生产者调用sem.wait(lck)之前在sem.notify()调用中等待。如果生产者首先到达那里,那么通知将会丢失,消费者将永远不会醒来。

此外,您应该始终使用循环来等待条件变量,并且它应该始终测试您正在等待的条件。

while ( piggybank < amount ) {
    sem.wait();
}
piggybank -= amount;

测试确保消费者不会等待生产者首先到达那里的通知。

您可以说if而不是while,但循环是一个学习的好习惯。当您编写多消费者计划时,您将需要它,因为在这种情况下,一个消费者可以醒来并发现另一个消费者首先醒来并拿走了钱(或任务,或者他们正在消费的任何东西。)