Пытаюсь оптимизировать высоконагруженную систему обработки задач, где критически важна минимальная задержка. Нужна очередь, которая: Поддерживает приоритеты (например, высокий, средний, низкий). Гарантирует lock-free или хотя бы wait-free доступ для хотя бы некоторых операций.Корректно работает в многопоточной среде (продьюсеры-консьюмеры).Позволяет динамически добавлять/удалять задачи без полной блокировки. Пробовал комбинировать std::priority_queue с std::mutex, но это создает contention при высокой нагрузке. Также экспериментировал с boost::lockfree::queue, но она не поддерживает приоритеты. Что пытался сделать: Вариант с атомарными CAS (Compare-And-Swap): Пытался создать свою очередь на основе связного списка с атомарными указателями. Проблема: корректная вставка с учетом приоритетов без блокировок оказалась сложнее, чем ожидалось. Использование std::atomic и std::memory_order: Пробовал реализовать что-то похожее на алгоритм Michael & Scott, но с приоритетами. Столкнулся с проблемами ABA (особенно в 32-битных системах). Гибридный подход (блокировки только для изменения приоритетов): Отдельный мьютекс для изменения порядка задач, но это снижает производительность.
Пытаюсь оптимизировать высоконагруженную систему обработки задач, где критически важна минимальная задержка. Нужна очередь, которая: Поддерживает приоритеты (например, высокий, средний, низкий). Гарантирует lock-free или хотя бы wait-free доступ для хотя бы некоторых операций.Корректно работает в многопоточной среде (продьюсеры-консьюмеры).Позволяет динамически добавлять/удалять задачи без полной блокировки. Пробовал комбинировать std::priority_queue с std::mutex, но это создает contention при высокой нагрузке. Также экспериментировал с boost::lockfree::queue, но она не поддерживает приоритеты. Что пытался сделать: Вариант с атомарными CAS (Compare-And-Swap): Пытался создать свою очередь на основе связного списка с атомарными указателями. Проблема: корректная вставка с учетом приоритетов без блокировок оказалась сложнее, чем ожидалось. Использование std::atomic и std::memory_order: Пробовал реализовать что-то похожее на алгоритм Michael & Scott, но с приоритетами. Столкнулся с проблемами ABA (особенно в 32-битных системах). Гибридный подход (блокировки только для изменения приоритетов): Отдельный мьютекс для изменения порядка задач, но это снижает производительность. [img]https://i.sstatic.net/EBumVHZP.png[/img]