Завершено
4
24.12.2024, 09:32
24.12.2024, 09:33
Разработать класс, позволяющий производить многопоточное буферизированное чтение данных. Данные читаются/пишутся блоками фиксированного размера. Типичный пример подобных данных - последовательность несжатых изображений одинакового размера (например, в формате bmp).
Задание предполагает одновременную работу двух потоков выполнения: один поток (поток-читатель) считывает данные в очередь, второй (поток-писатель) - с некоторой периодичностью проверяет очередь, выбирает из неё очередные данные, и записывает их в файлы.
Очередь выполняет здесь роль регулятора, который:
Класс очереди должен быть спроектирован в рамках концепции RAII, и являться владельцем буфера данных.
Примерный прототип класса очереди:
class ImageFIFO {
ImageFIFO(size_t blockSize, size_t maxBlocks);
~ImageFIFO();
void * getFree();
void addReady(void * data);
void * getReady();
void addFree(void *data);
};
ImageFIFO(blockSize, maxBlocks) - выделяет буфер данных, с заданным размером блока, и с фиксированным количеством блоков.~ImageFIFO() - деструктор, освобождает память.getFree() - метод, вызываемый потоком-писателем, для получения указателя на очередной свободный блок данных.addReady(data) - метод, вызываемый потоком-писателем, помечающий, что найденный ранее блок данных заполнен и готов к передаче.getReady() - метод, вызываемый потоком-читателем, для получения указателя на очередной готовый блок данных.addFree(data) - метод, вызываемый потоком-читателем, помечающий, что выданный ранее блок данных обработан, освобождён и может повторно использоваться очередью.Необходимо реализовать ряд тестов в порядке усложнения:
Дополнительный бал за тест на "необычные" модели поведения потоков читателя и писателя:
getFree(), затем заполняет данные, а
затем в произвольном порядке помечает блоки как готовые вызовами
addReady().getReady(), сохраняет данные, а затем
в произвольном порядке помечает блоки как свободные вызовами
addFree().Ещё один дополнительный бал за предусмотренную возможность отслеживать выходы за пределы буфера.