Здравствуйте, barney, Вы писали:
B>А такое можно реализовать легковесно в user mode не отдавая контекст ядру/планировщику?
Наверное, ничего лучше инструкции pause пока не придумали.
B>Любопытный вопрос. А какие практики используются вместо этого в ядре?
Конкретно ядро Windows перед захватом спинлока задирает IRQL до DISPATCH_LEVEL, это предотвращает вытеснение
потока планировщиком (хотя это не исключает, например, приход прерывания, в результате чего код все равно
будет временно вытеснен). Ну и вместо обычных спинлоков рекомендуется применять спинлоки с очередями на
стеке (in-stack queued spinlock) — там каждый поток вместо глобальной переменной теребит переменную у
себя в стеке, ну и гарантируется порядок захвата спинлока потоками (т.е. убирается проблема "starvation").
Про linux не в курсе, я его видел только "на картинках"
В режиме пользователя запретить вытеснение потока нельзя. Думаю, в режиме пользователя по этой
причине никаких спинлоков быть не должно.