Skip to content

Latest commit

 

History

History

lock-free-bank

Lock-Free Bank

Задание включает в себя следующие исходные файлы:

  • src/Bank.kt содержит интерфейс для гипотетического банка.
  • src/BankImpl.kt содержит код-заготовку реализации операций банка без блокировок.

В реализации используются основные идеи из работы "A Practical Multi-Word Compare-and-Swap Operation" by T. L. Harris, c упрощенной (ускоренной) операцией DCSS за счет отсутвия проблемы ABA. Код содержит todo коментарии в тех местах, которые необходимо доделать. В этих местах содержится такой код-заглушка, что он работает корректно при использовании из одного потока, но небезопасен для использования из не скольких потоков одновременно.

Задание

Необходимо доработать реализую BankImpl так, чтобы она стала безопасной для использования из множества потоков одновременно.

  1. Написать многопоточную реализацию метода withdraw;
  2. Написать реализацию метода acquire согласно написанной в нем документации;
  3. Написать реализацию метода TransferOp.invokeOperation.

Весь код должен содержаться в файле BankImpl.kt.

Сборка и тестирование

Для проверки вашего решения запустите из корня репозитория:

  • ./gradlew test на Linux или MacOS
  • gradlew test на Windows

При этом автоматически будут запущены следующие тесты:

  • FunctionalTest проверяет базовую корректность работы операций банка.
  • MTStressTest проверяет основные аспекты корректности работы банка при множестве одновременно работающих потоков исполнения.
  • LinearizabilityTest проверяет все аспекты корректности работы банка и линеаризуемость операций, сравнивая различные варианты одновременного выполнения операций с различными вариантами их перестановки на модельной однопоточной реализации.
  • LockFreedomTest проверяет что реализация работает без блокировок.

Обратите внимание, что исходная реализация проходит только FunctionalTest, но не проходит многопоточные тесты.

Формат сдачи

Выполняйте задание в этом репозитории. Инструкции по сдаче заданий находятся в этом документе.