Проект реализует алгоритм ассинхронной работы, описанный в test_task_description.txt.
Для сборки проекта потребуется:
- CMake версии 3.12 или выше,
- gcc 12.3.0 или выше.
Целевая ОС: Linux.
Для сборки проекта следует выполнить команды в директории проекта:
mkdir <output dir>, гдеoutput dir— имя поддиректории сборки, напримерoutcd <output dir>cmake -DCMAKE_BUILD_TYPE=<build type> .., гдеbuild type— тип сборки,ReleaseилиDebugmake
Для запуска собранной программы необходимо выполнить команду:
./data_processor <buffer_size> [worker_count] [run_mode]
Где:
- buffer_size — размер входного и выходного буфера в байтах (больше 0, обязательный параметр);
- worker_count — количество рабочих потоков (больше 0, по умолчанию количество ядер процессора);
- run_mode — режим работы:
normal,check(по умолчаниюnormal), в режимеcheckвыполняется дополнительная проверка выходного массива и выводится время, потраченное на каждое действие (генерация, процессинг, проверка).
Например:
./data_processor 104857600 8
Для получения справки необходимо запустить программу без параметров.
- Основная логика программы реализована в классе
dpr::data_processor_t(файлы data_processor.hpp и data_processor.cpp). - Количество реальных рабочих потоков может быть меньше заданного, если размер буфера недостаточно большой. Так для буффера размером 400 байт реальное количество рабочих потоков будет не больше 2.
- Для обмена данными между раздающим и рабочими потоками используется кольцевой буфер. Это lock-free структура, реализованная в классе
util::ring_buffer_t<T>(файл ring_buffer.hpp). Для обмена данными используется два кольцевых буфера на каждый рабочий поток. - Для рабочих потоков используется класс
util::worker_thread_t<T>(файл worker_thread.hpp).