Какой шаблон лучше всего обрабатывать X элементов в секунду на C++? ⇐ C++
-
Гость
Какой шаблон лучше всего обрабатывать X элементов в секунду на C++?
У меня есть класс Consumer, который должен удалять n элементов из очереди в секунду, но не более того:
класс Consumer { Consumer(int items_per_sec, Storage& Storage): items_per_sec{items_per_sec}, хранилище{хранилище} {} недействительный потреблять () { while (!storage.empty()) { for (int i = 0; i < items_per_sec; ++i) { хранилище.потреблять(); } std::this_thread::sleep_for(1s); } } частный: int items_per_sec; Хранение и хранение; }; Здесь Хранилище — это поточно-ориентированная абстракция очереди. Предположим, что существует также класс Producer, который добавляет элементы в это хранилище, но в какой-то момент останавливается, и существует только один поток-производитель и один поток-потребитель.
С этим кодом есть (как минимум) две проблемы, но я не знаю, как их исправить:
[*]Потребитель не потребляет ровно n элементов в секунду, поскольку он спит целую секунду после обработки n элементов (предположим, n не будет настолько большим, чтобы обработка элементов n занимала более 1 секунды, но и не обязательно крошечным). [*]Если на последнюю секунду не осталось ровно n элементов, Потребитель попытается использовать слишком много раз.
Как вообще правильно реализовать этот шаблон «делать что-то n раз в секунду»?
У меня есть класс Consumer, который должен удалять n элементов из очереди в секунду, но не более того:
класс Consumer { Consumer(int items_per_sec, Storage& Storage): items_per_sec{items_per_sec}, хранилище{хранилище} {} недействительный потреблять () { while (!storage.empty()) { for (int i = 0; i < items_per_sec; ++i) { хранилище.потреблять(); } std::this_thread::sleep_for(1s); } } частный: int items_per_sec; Хранение и хранение; }; Здесь Хранилище — это поточно-ориентированная абстракция очереди. Предположим, что существует также класс Producer, который добавляет элементы в это хранилище, но в какой-то момент останавливается, и существует только один поток-производитель и один поток-потребитель.
С этим кодом есть (как минимум) две проблемы, но я не знаю, как их исправить:
[*]Потребитель не потребляет ровно n элементов в секунду, поскольку он спит целую секунду после обработки n элементов (предположим, n не будет настолько большим, чтобы обработка элементов n занимала более 1 секунды, но и не обязательно крошечным). [*]Если на последнюю секунду не осталось ровно n элементов, Потребитель попытается использовать слишком много раз.
Как вообще правильно реализовать этот шаблон «делать что-то n раз в секунду»?
Мобильная версия