Я пользуюсь спинлоком (потоковой одни) с в общем-то O (1) Доступ / удаление элемента списка в разделе заблокированного кода.
Я говорю в общем-то потому что в 99,9% случаев код не проходит по списку (который может содержать более 1000 элементов).
Код обычно извлекает только один элемент на основе элемента списка намек указатель, а затем выполнить пару если ветки для модификации процитированного намек элемент; все же это должен быть несмежный доступ к памяти.
Это хорошая идея использовать спин-блокировки или я должен перейти на мьютексы?
Я нацеливаюсь на максимальную производительность, не заботясь об использовании ЦП в этом контексте.
ура
После выполнения некоторых тестов с воспроизводимыми контрольными примерами, переключение между pthread mutex а также спинлок реализация, я могу сказать, что если мьютекс использует чуть меньше процессора, то спинлок реализация в два раза быстрее обрабатывает элементы из очереди.
Я считаю правильный ответ, учитывая O (1) характер функции обработки списка и факт этого (в основном) постоянная время крошечный, одобряет спинлок выбор против мьютекс.
Так что, если кто-то хочет достичь максимальной производительности, его не волнуют циклы потерь процессора, Взаимные блокировки предпочтительнее против мьютексы если время выполнения защищенного кода крошечный (и лучше постоянная).
Как правило, для коротких критических секций (например, когда он просто обновляет указатели списка) может быть предпочтительна блокировка вращения.
При небольшом количестве различий между спин-блокировками и мьютексами должно быть мало различий, поскольку неконтролируемый путь сильно оптимизирован в последнем.
Разница возникает, когда критический раздел становится утвержденным. Когда мьютекс берется, блокировка блокирует поток и снимает его с очереди запуска планировщика, и ему требуется гораздо больше времени для пробуждения и блокировки мьютекса, когда он в конечном итоге освобождается, тогда как спин-блокировка просто вращается в надежде, что спин-блокировка выпущен в ближайшее время.