Skip to content

GNDavydov/lock_free_stack

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

3 Commits
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Lock-free-stack

Стек Трайбера (англ. Treiber Stack) — масштабируеммый стек без блокировок (англ. lock-free). Считается, что впервые данный алгоритм был опубликовал R. Kent Treiber. Алгоритм использует примитив CAS (compare and swap).

Требования к алгоритму

Основное отличие стека Трайбера от однопоточного заключается в том, что несколько потоков имеют доступ к данным в стеке одновременно, а значит, могут удалять и добавлять элементы. Необходимо как-то контролировать процесс взаимодействия потоков. Конечно, это можно было бы сделать, просто блокируя каждую операцию, производимую на стеке. Но такая блокировка уменьшает параллелизм, а значит, уменьшаем масштабируемость программы. Уходя от данной стратегии, разрешим потокам работать одновременно со стеком и потребуем от алгоритма условие неблокируемости.

Lock-free алгоритмы и CAS

Сравнение с обменом (англ. compare and set, compare and swap, CAS) — атомарная инструкция, сравнивающая значение в памяти с первым аргументом и, в случае успеха, записывающая второй аргумент в память.

Ниже представлен псевдокод операции CAS для целочисленных переменных

fun cas(int* p, int old, int new): bool
    if *p != old 
        return false
    *p = new
    return true

Удаление элементов

Запомним, на что указывает голова стека (запишем в локальную переменную head). Значение, которое хранит в себе head, — то, что необходимо будет вернуть. Попробуем переместить голову стеком CASом. Если удалось — вернем head.value. Если нет, то это означает, что с момента начала операции стек был изменен. Поэтому попробуем проделать операцию заново.

Добавление элементов

Запомним, куда указывает голова стека (запишем в локальную переменную head). Создадим новый элемент, который хотим добавить в начало стека. Указатель на следующее значение для него — head. Попробуем переместить H на новый элемент, при помощи CAS. Если это удалось — добавление прошло успешно. Если нет, то кто-то другой изменил стек, пока мы пытались добавить элемент. Придется начинать сначала.

LINKS

https://neerc.ifmo.ru/wiki/index.php?title=%D0%A1%D1%82%D0%B5%D0%BA_%D0%A2%D1%80%D0%B0%D0%B9%D0%B1%D0%B5%D1%80%D0%B0#.D0.A2.D1.80.D0.B5.D0.B1.D0.BE.D0.B2.D0.B0.D0.BD.D0.B8.D1.8F_.D0.BA_.D0.B0.D0.BB.D0.B3.D0.BE.D1.80.D0.B8.D1.82.D0.BC.D1.83

https://habr.com/ru/post/271549/

About

lock_free_stack implementation

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published