Задание включает в себя следующие исходные файлы:
src/Bank.kt
содержит интерфейс для гипотетического банка.src/BankImpl.kt
содержит код-заготовку реализации операций банка без блокировок.
В реализации используются основные идеи из работы "A Practical Multi-Word Compare-and-Swap Operation" by T. L. Harris, c упрощенной (ускоренной) операцией DCSS за счет отсутвия проблемы ABA. Код содержит todo коментарии в тех местах, которые необходимо доделать. В этих местах содержится такой код-заглушка, что он работает корректно при использовании из одного потока, но небезопасен для использования из не скольких потоков одновременно.
Необходимо доработать реализую BankImpl
так, чтобы она стала безопасной для использования из множества потоков одновременно.
- Написать многопоточную реализацию метода
withdraw
; - Написать реализацию метода
acquire
согласно написанной в нем документации; - Написать реализацию метода
TransferOp.invokeOperation
.
Весь код должен содержаться в файле BankImpl.kt
.
Для проверки вашего решения запустите из корня репозитория:
./gradlew test
на Linux или MacOSgradlew test
на Windows
При этом автоматически будут запущены следующие тесты:
FunctionalTest
проверяет базовую корректность работы операций банка.MTStressTest
проверяет основные аспекты корректности работы банка при множестве одновременно работающих потоков исполнения.LinearizabilityTest
проверяет все аспекты корректности работы банка и линеаризуемость операций, сравнивая различные варианты одновременного выполнения операций с различными вариантами их перестановки на модельной однопоточной реализации.LockFreedomTest
проверяет что реализация работает без блокировок.
Обратите внимание, что исходная реализация проходит только FunctionalTest
, но не проходит многопоточные тесты.
Выполняйте задание в этом репозитории. Инструкции по сдаче заданий находятся в этом документе.