在C++中每秒处理X数量的项目的最佳模式是什么?[关闭]

kjthegm6  于 2024-01-09  发布在  其他
关注(0)|答案(1)|浏览(156)

已关闭。此问题需要details or clarity。目前不接受回答。
**要改进此问题吗?**通过editing this post添加详细信息并阐明问题。

3天前关闭。
Improve this question
我有一个Consumer类,它应该每秒从队列中删除n个项目,但没有更多:

  1. class Consumer {
  2. Consumer(int items_per_sec, Storage& storage) :
  3. items_per_sec{items_per_sec}, storage{storage} {}
  4. void consume() {
  5. while (!storage.empty()) {
  6. for (int i = 0; i < items_per_sec; ++i) {
  7. storage.consume();
  8. }
  9. std::this_thread::sleep_for(1s);
  10. }
  11. }
  12. private:
  13. int items_per_sec;
  14. Storage& storage;
  15. };

字符串
这里,Storage是一个线程安全的队列抽象。假设还有一个Producer类向这个存储区添加项目,但它在某个点停止,并且只有一个生产者线程和一个消费者线程。
这段代码(至少)有两个问题,但我不确定如何修复它们:

  1. Consumer每秒并不消耗n项,因为它在处理n项后会休眠整整一秒(假设n不会太高,以至于处理n项需要超过1秒,但它也不一定很小)。
    1.如果在最后一秒没有n项,Consumer将尝试消耗太多次。
    在“每秒做n次某件事”的一般情况下,实现这种模式的正确方法是什么?
jv2fixgn

jv2fixgn1#

一般来说,这应该是可行的-你创建一个带有处理项目时间戳的容器。可能std::deque是一个很好的候选者(由于pop_front()push_back()的存在)现在算法是:
当你把元素添加到队列中时,如果需要的话,通知另一个线程条件变量。所以基本上把std::deque的大小限制在items_per_sec,并且只保持时间戳比1秒更新鲜就可以完成这项工作。

相关问题