我需要实施一个存钱罐模拟,客户可以从中存入或取款。客户端应表示为线程,而存储库是整数变量。我需要创建两个名为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;
}
我需要某种条件,但我不知道如何使用条件变量。
答案 0 :(得分:0)
您可能遇到的一个问题是:您的代码无法保证消费者在生产者调用sem.wait(lck)
之前在sem.notify()
调用中等待。如果生产者首先到达那里,那么通知将会丢失,消费者将永远不会醒来。
此外,您应该始终使用循环来等待条件变量,并且它应该始终测试您正在等待的条件。
while ( piggybank < amount ) {
sem.wait();
}
piggybank -= amount;
测试确保消费者不会等待生产者首先到达那里的通知。
您可以说if
而不是while
,但循环是一个学习的好习惯。当您编写多消费者计划时,您将需要它,因为在这种情况下,一个消费者可以醒来并发现另一个消费者首先醒来并拿走了钱(或任务,或者他们正在消费的任何东西。)