Основной вывод в первую очередь. Бесплатная модель написала на C++20 очередь SPSC, которая скомпилировалась и прошла 1000 итераций функционального тестирования на моем ноутбуке. Первый запуск ThreadSanitizer на бесплатном сервере обнаружил на нем гонку данных. Исправлением было две памяти_или...
Основной вывод в первую очередь. Бесплатная модель написала на C++20 очередь SPSC, которая скомпилировалась и прошла 1000 итераций функционального тестирования на моем ноутбуке. Первый запуск ThreadSanitizer на бесплатном сервере обнаружил на нем гонку данных. Исправление заключалось в двух загрузках Memory_order_acquire. Модульные тесты не смогли обнаружить эту ошибку. Этап дезинфицирующего средства может.
Фон
Небольшому внутреннему инструменту требовалась ограниченная очередь между двумя потоками: один читал кадры из сокета, другой их анализировал. Требования были фиксированными: постоянная мощность, отсутствие выделения ресурсов после запуска, один производитель, один потребитель, отсутствие блокировок.
Я создал первую реализацию с конечной точкой бесплатной модели MonkeyCode. Раскрытие информации: эта статья была подготовлена в рамках информационно-пропагандистской программы MonkeyCode.
Контракт, который я дал модели, был коротким: try_push(T), try_pop(T&), фиксированная емкость, без блокировки, только SPSC. Модель вернула классический кольцевой буфер с двумя атомами. Это выглядело как учебник. Это не так.
Цель
Критерии успеха по порядку:
Компилируется с -Wall -Wextra -Werror на C++20.
Функциональный тест пройден: введите 1 000 000 целых чисел, извлеките их, проверьте последовательность.
ThreadSanitizer сообщает об отсутствии гонок в чистой сборке.
Третий критерий имел значение. Гре