Возможно, я ещё не ответил на вопрос. Спинлоки используются во всех разумных операционных системах (ядрах), работающих на многопроцессорных системах и использующих эту многопроцессорность.
Если компьютер однопроцессорный или ядро не поддерживает многопроцессорность, спинлоки нет смысла использовать, потому что нет других процессоров, которые могут «влезть» и что-то испортить.
Если несколько процессоров имеют возможность одновременного доступа к одной области памяти, нельзя давать им возможности что-либо делать с этой памятью, не задумываясь о действиях других процессоров.
Например, 2 процесса в ядре одновременно выполняются на 2-х разных процессорах (или процессорных ядрах) и периодически добавляют новые элементы в начало односвязного списка. Для добавления элемента в односвязный список нужно изменить 2 указателя:
Здесь new_item — указатель на добавляемый элемент списка, after — указатель на элемент, за которым пойдет в списке новый элемент.
Может так совпасть, что оба процессора попытаются одновременно добавить разные элементы после какого-то одного. То есть сначала оба процессора установят new_item->next в одинаковое значение — after->next (указатель на элемент, следовавший за after до добавления новых элементов). Второй операцией оба процессора попытаются записать в одну ячейку new_item->next разные указатели, но, конечно же, останется записанным только одно.
Что мы видим: за after теперь следует один из новых элементов, а за ним следует элемент, который раньше следовал за after. То есть мы добавили только один из двух элементов, неожиданно? К тому же элементы будут исчезать не когда нам захочется, а случайно, то есть если «повезёт» или «не повезёт».
Чтобы элементы добавлялись правильно, нужно сделать операцию добавления элемента атомарной. Атомарность как раз достигается «оборачиванием» этой составной операции парой spin_lock/spin_unlock.
Если компьютер однопроцессорный или ядро не поддерживает многопроцессорность, спинлоки нет смысла использовать, потому что нет других процессоров, которые могут «влезть» и что-то испортить.
Например, 2 процесса в ядре одновременно выполняются на 2-х разных процессорах (или процессорных ядрах) и периодически добавляют новые элементы в начало односвязного
Здесь new_item — указатель на добавляемый элемент списка, after — указатель на элемент, за которым пойдет в списке новый элемент.
Может так совпасть, что оба процессора попытаются одновременно добавить разные элементы после какого-то одного. То есть сначала оба процессора установят new_item->next в одинаковое значение — after->next (указатель на элемент, следовавший за after до добавления новых элементов). Второй операцией оба процессора попытаются записать в одну ячейку new_item->next разные указатели, но, конечно же, останется записанным только одно.
Что мы видим: за after теперь следует один из новых элементов, а за ним следует элемент, который раньше следовал за after. То есть мы добавили только один из двух элементов, неожиданно? К тому же элементы будут исчезать не когда нам захочется, а случайно, то есть если «повезёт» или «не повезёт».
Чтобы элементы добавлялись правильно, нужно сделать операцию добавления элемента