已关闭。此问题需要details or clarity。目前不接受回答。
**要改进此问题吗?**通过editing this post添加详细信息并阐明问题。
3天前关闭。
Improve this question的
我有一个Consumer
类,它应该每秒从队列中删除n
个项目,但没有更多:
class Consumer {
Consumer(int items_per_sec, Storage& storage) :
items_per_sec{items_per_sec}, storage{storage} {}
void consume() {
while (!storage.empty()) {
for (int i = 0; i < items_per_sec; ++i) {
storage.consume();
}
std::this_thread::sleep_for(1s);
}
}
private:
int items_per_sec;
Storage& storage;
};
字符串
这里,Storage
是一个线程安全的队列抽象。假设还有一个Producer
类向这个存储区添加项目,但它在某个点停止,并且只有一个生产者线程和一个消费者线程。
这段代码(至少)有两个问题,但我不确定如何修复它们:
Consumer
每秒并不消耗n
项,因为它在处理n
项后会休眠整整一秒(假设n
不会太高,以至于处理n
项需要超过1秒,但它也不一定很小)。
1.如果在最后一秒没有n
项,Consumer
将尝试消耗太多次。
在“每秒做n次某件事”的一般情况下,实现这种模式的正确方法是什么?
1条答案
按热度按时间jv2fixgn1#
一般来说,这应该是可行的-你创建一个带有处理项目时间戳的容器。可能
std::deque
是一个很好的候选者(由于pop_front()
和push_back()
的存在)现在算法是:当你把元素添加到队列中时,如果需要的话,通知另一个线程条件变量。所以基本上把
std::deque
的大小限制在items_per_sec
,并且只保持时间戳比1秒更新鲜就可以完成这项工作。