Операция над переменной preempt_count не является атомарной. Область кода между inc и dec из preempt_count потока гарантированно не будет отключена планировщиком. Контекстное переключение из текущего потока в этой области кода может произойти только в последующих встроенных исключениях или прерываниях. После завершения первой операции inc дальнейшие обработчики будут видеть, что переменная не равна нулю, поэтому не вызывает контекстный переключатель. Перед тем, как инк заканчивается, нить может быть отключена, но это нормально, поскольку код не достиг защищенной области.
Некоторые детали: Определение атомной переменной должно быть чем-то вроде "Atomic variables are the ones on whom the read modify write operation is done as one instruction with out any interruption". Операция «Read-Modify-Write» на preempt_count может быть прервана другим обработчиком исключений или обработчиком прерываний, но только строго встроенным способом, то есть дизайном ядра. Поскольку эти встроенные операции находятся в парах, таким образом, значение preempt_count в конечном итоге не будет искажено. Хотя операция R-M-W может быть прервана и текущий поток может быть отключен (только если ни один из нескольких встроенных инк не завершился), но это нормально, поскольку код не достиг защищенной области. Как только нить будет переключена назад, она продолжит завершение работы R-M-W и с этой точки на текущей нити не будет отключена, пока все парные dec (s) не закончатся.
Большое спасибо. вы можете ответить на мои следующие вопросы тоже PLS. – mousey
большое спасибо. – mousey
@caf и mousey: Если inc/dec также вызывается обработчиками ошибок или обработчиками прерываний, было бы безопасно? Или есть какие-то правила, говорящие, что это невозможно? Идеи? – minghua