Я реализовал циклическую очередь, используя массив на C++. Очередь использует две атомарные переменные, переднюю и заднюю, для управления операциями постановки и удаления из очереди. Когда элемент помещается в очередь, задняя часть увеличивается, а когда элемент выводится из очереди, увеличивается передняя часть.
Я создал 16 экземпляров этой циклической очереди, каждый размером 2^23. элементов.
Я тестирую два сценария:
Сценарий 1:
Есть 2 потоки чтения.
Каждый поток чтения прикреплен к отдельному ядру ЦП и изолирован.
Каждое устройство чтения отвечает за 8 из 16 очередей и последовательно проверяет каждую очередь на наличие пакетов, выполняя операции удаления из очереди при обнаружении пакетов, за которым следует определенная обработка.
Другой поток помещает элементы в разные циклические очереди.
Сценарий 2:
Имеется 8 потоков чтения.Каждый поток чтения прикреплен к отдельному ядру ЦП и изолирован.
Каждый поток чтения отвечает за 2 из 16 очередей и последовательно проверяет каждую очередь на наличие пакетов, выполняя операции удаления из очереди при обнаружении пакетов с последующей определенной обработкой. .
Другой поток ставит элементы в разные циклические очереди.
Метрика:
Основной метрикой для сравнения в обоих сценариях является затраченное время. элементом между постановкой в очередь и удалением из очереди (задержка или время, проведенное пакетом внутри очереди).
Проблема:
Естественно, я ожидал, что увеличение количество потоков чтения уменьшит задержку. Однако я заметил обратное: задержка увеличивалась, когда было задействовано больше читателей.
Кроме того, я заметил, что когда используется больше потоков чтения, некоторые из потоков имеют меньшую загрузку ЦП (около 70 -80%), несмотря на то, что в них присутствует бесконечный цикл while.
Вопрос:
Почему задержка может увеличиваться при добавлении большего количества читателей? Существуют ли в моей реализации конкретные проблемы, связанные с параллелизмом или кешем, которые могли бы объяснить такое поведение?
Что может быть причиной более низкой загрузки ЦП в некоторых потоках, когда используется больше потоков чтения?
Дополнительная информация:
Код написан на C++.
Закрепление и изоляция ядра были выполнены для всех потоков во избежание помех.
Я пытался проверить наличие конфликтов или чего-либо еще, но ничего не нашел.
Подробнее здесь: https://stackoverflow.com/questions/785 ... cular-queu
Неожиданное увеличение задержки при увеличении числа читателей при реализации многопоточной кольцевой очереди на C++ ⇐ C++
-
- Похожие темы
- Ответы
- Просмотры
- Последнее сообщение
-
-
Неожиданное дополнительное увеличение задержки при включении вторичного потока
Anonymous » » в форуме C++ - 0 Ответы
- 19 Просмотры
-
Последнее сообщение Anonymous
-
-
-
Неожиданное дополнительное увеличение задержки при включении вторичного потока
Anonymous » » в форуме C++ - 0 Ответы
- 9 Просмотры
-
Последнее сообщение Anonymous
-