O ( 1 )
Это означает, что если вы вносите изменения в структуру данных, важной характеристикой является то, что вы можете сделать все моды в частной структуре данных, а затем обменяться изменениями в одной атомарной инструкции.
Свобода блокировок обычно проще всего, когда ваши структуры данных неизменны ( чисто функциональны ). Вы просто сохраняете глобальный указатель на текущую версию структуры данных. Читателям не нужно ничего блокировать. Модификации структуры данных осуществляются путем замены глобального указателя на одну неизменную структуру данных на другую.
Например: если у вас чисто функционально сбалансированное дерево, вы:
- Запишите текущий глобальный указатель на корень дерева.
- Создайте новое дерево, которое вставляет или удаляет узел. (Это логарифмическое по времени и пространству число узлов, находящихся в настоящее время в дереве, и включает создание новых узлов от точки модификации до корня и просто наведение всего нового на старые части предыдущей версии структуры данных. )
- Атомно сравнить и поменять местами глобальный указатель на корень. (Обратите внимание, что это может не сработать, если между записью старого корневого указателя и сейчас произошла другая модификация. Если это произойдет, вернитесь к шагу 1 и повторите попытку. Это так называемое «оптимистическое управление параллелизмом».)
Обратите внимание, что наиболее важной частью является то, что я сказал выше о необходимости поддерживать инварианты представления. Обычно недостаточно иметь алгоритм, который атомарно вносит изменения в середине дерева. Почему? Например: у вас может быть поток чтения, который находится в процессе предварительного обхода дерева. Если вы модифицируете узел, который является предком узла, который они в данный момент читают, то вы лишите законной силы предварительные условия, которые, по их мнению, были применены. Читатель должен уметь работать со структурой данных в точности так, как это было до внесения изменений, или точно так же, как и после внесения изменений. Не что-то среднее.
O ( l o g( N) )O ( N)