【发布时间】:2018-09-24 01:29:59
【问题描述】:
我需要实现一个存钱罐模拟,客户可以从中存款或取款。客户端应该表示为线程,而存钱罐是一个整数变量。我需要创建两个称为生产者和消费者的函数,它们应该能够存入或提取由参数定义的金额。限制是消费者只有在存钱罐中有足够的钱时才能取款。如果没有,它应该等待存钱罐填满。
消费者和生产者必须同时访问存钱罐,并添加或删除随机金额。
我在这方面遇到了麻烦。我是 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;
}
我需要某种条件,但我不知道如何使用条件变量。
【问题讨论】:
-
你的问题是?
-
使用
condition_variable.wait()的重载,它接受一个谓词,当piggybank有足够的值时,等待应该解除阻塞。 -
另外 - 只是一个风格评论:我不喜欢
sem的名称condition_variable。这对我来说似乎是一种误导,因为它不是信号量。 -
您还应该知道,由于目前生产者线程只向存钱罐添加一个随机值,如果该数量小于消费者想要提取的随机数量,消费者将永远等待捎带获得足够的价值。
-
当开发人员说“生产者/消费者”时,他们通常指的是生产者将不同对象或不同值放入队列的架构,消费者删除对象/值并对它们做一些事情。将把钱存入银行账户的人称为“生产者”,将提款的人称为“消费者”,这种比喻有点超出了通常的界限。
标签: c++ multithreading producer-consumer