Skip to content

akrisfx/Timed-Storage

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

18 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Timed Storage

This code tested on Ubuntu

for run you need install boost:

$ sudo apt update
$ sudo apt install  libboost-all-dev

for run use:

$ make 

Task

Необходимо реализовать шаблонный класс временной очереди, где тип шаблона отвечает за хранимый тип данных в контейнере. Временная очередь это контейнер, который автоматически удаляет элементы из него, по истечению времени timeout.

Необходимо реализовать два метода: Метод добавления элемента в очередь. int push(ItemT item, std::chrono::milliseconds timeout) Принимает два параметра: item - элемент который необходимо добавить timeout - время в миллисекундах, по истечению которого необходимо удалить элемент Возвращает: Уникальный идентификатор объекта, по которому можно будет позже его получить

Метод получения элемента из очереди std::pair<bool, ItemT> pop(int idx) Принимает: idx - уникальный идентификатор объекта, который вернул метод push() Возвращает: Пару из двух элементов: флага и значения. Если элемент на момент вызова pop() все еще находится в очереди, то метод должен вернуть пару {true, item}, то есть флаг показывает наличие элемента в контейнере на момент вызова Если элемента в контейнере нет, то возвращается пара {false, item}, где item это объект, сконструированнйы по умолчанию Примечания: Метод pop() не является блокирующим и не должен дожидаться появления элемента в контейнере

Пример использования:

    int main() {
        TimedStorage<int> queue;
        auto a_idx = queue.push(3, std::chrono::milliseconds(3000)); // Добавляем элемент с таймаутом 3 секунды
        auto b_idx = queue.push(4, std::chrono::milliseconds(1000)); // Добавляем элемент с таймаутом 1 секунда

        std::this_thread::sleep_for(std::chrono::milliseconds(2000)); // Ждем 2 секунды

        auto [b_flag, b_value] = queue.pop(b_idx); // Возвратит пару (false, 0)
        auto [a_flag, a_value] = queue.pop(a_idx); // Возвратит пару (true, 3)

        return 0;
    }

Примечания: Очередь должна быть потокобезопасна, то есть должна иметь возможность работы с несколькими потоками одновременно.

Ниже приведено примерное объявление класса. Необходимо дополнить его необходимыми полями и реализовать методы push() и pop().
Для реализации желательно использовать STL, а также стандарт языка C++17.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published