Когда стоит использовать спинлок? - PullRequest
1 голос
/ 17 февраля 2011

Кажется, что спин-блокировки не так уж хороши, так как они тратят циклы ЦП, когда они ожидают (блокируют).Если поток просто засыпает во время ожидания сигнала для активации, то циклы ЦП не теряются при вращении.

Может быть, стоит использовать спин-блокировку, если блокировки удерживаются в течение очень короткого времени,тогда, может быть, он использует меньше времени?Если это правда, почему?

Ответы [ 3 ]

3 голосов
/ 17 февраля 2011

Да, это правильно.

Потому что переключение контекста дорого. ОС и ЦП должны выполнить (относительно) большой объем работы для переключения контекста. Вместо этого вращение в течение нескольких циклов будет намного дешевле, даже если теоретически эти циклы потрачены впустую.

2 голосов
/ 17 февраля 2011

Спинлоки быстрее, когда они не блокируются, поэтому они полезны в ситуациях, когда в блокировке очень низкий уровень конкуренции (т. Е. Очень низкая вероятность того, что она уже заблокирована).

Когда потокпереходит в спящий режим, вызывая переключение контекста (т. е. этот поток заменяется другим, чтобы другой поток мог работать).Обычно для получения стандартного мьютекса накладные расходы выше, чем для проверки, свободен ли спин-блокировка.Очень часто для спин-блокировок требуется только одна атомарная операция, когда блокировка свободна.

Эти свойства делают спин-блокировки полезными для мелкозернистой блокировки, поскольку использование меньших блокировок уменьшает конфликт на каждой блокировке.Например, в одном из моих проектов есть карта с ~ 200 000 записей, к которым одновременно получают доступ более 16 потоков (тип корпоративного сервера).Наличие спин-блокировки для каждой записи довольно эффективно, потому что вероятность того, что два потока в этом приложении попытаются попасть в одну и ту же запись одновременно, невелика.

0 голосов
/ 10 мая 2011

Спинлоки обеспечивают плотный опрос и более быстрое пробуждение, когда блокировка становится доступной. Они также хороши для неконтролируемых блокировок, как указал @Chris. Я бы сказал, используйте спин блокировки:

  1. Если все, что вас волнует, это производительность вашего собственного приложения, и вы не хотите уступать другим приложениям, а в вашем приложении <= потоков, чем количество ядер. Тем не менее, я бы по-прежнему рассматривал блокировку билетов, чтобы оптимизировать ошибки кеша ... они также вращаются, но значительно уменьшают пропуски кеша. </p>

  2. или, если ваши замки менее востребованы

...