Изменения

Перейти к: навигация, поиск

Treiber stack

237 байт добавлено, 14:16, 30 сентября 2018
Алгоритм
== Алгоритм ==
=== Структура стека ===
Как всегда каждый элемент стека содержит информацию о хранимом значении и указатель на следующий элемент. Также имеем указатель на голову стека <tex>H</tex>, который будем изменять при помощи операции <tex>CAS</tex>. Если <tex>H==NULLnull</tex>, то стек - пуст.
=== Удаление элементов ===
Запомним, на что указывает голова стека (запишем в локальную переменную <tex>head</tex>). Значение, которое хранит в себе <tex>head - </tex>, — то, что необходимо будет вернуть. Попробуем переместить голову стеком CASом<tex>CAS</tex>ом. Если удалось - вернем <tex>head.value</tex>. Если нет, то это означает, что с момента начала операции стек был изменен. Поэтому попробуем проделать операцию заново.
=== Добавление элементов ===
Запомним, куда указывает голова стека (запишем в локальную переменную <tex>head</tex>). Создадим новый элемент, который хотим добавить в начало стека. Указатель на следующее значение для него - — <tex>head</tex>. Попробуем переместить H на новый элемент, при помощи <tex>CAS</tex>. Если это удалось - добавление прошло успешно. Если нет, то кто-то другой изменил стек, пока мы пытались добавить элемент. Придется начинать сначала.
== Псевдокод ==
16
правок

Навигация