В рамках данного задания необходимо реализовать алгоритм монотонных часов на регулярных регистрах.
В файле src/MonotonicClock.kt
находится описание интерфейса часов, которые вам предстоит реализовать. Время, которое показывают часы,
состоит из трёх целочисленных переменных d1
, d2
и d3
, задающих время от старшего разряда к младшему.
Все времена упорядочены лексикографически.
data class Time(val d1: Int, val d2: Int, val d3: Int)
Интерфейс часов должен реализовывать операции записи и чтения. Один поток пишет монотонно увеличивающееся время, а другой поток его читает. Не обязательно, чтобы чтения другого потока были линеаризуемы, но важно, чтобы другой поток видел монотонно возрастающие времена и видел правильное время, если чтения времени не происходит параллельно с его записью.
interface MonotonicClock {
fun write(time: Time)
fun read(): Time
}
В вашем распоряжении есть класс RegularInt
, который моделирует регулярный
регистр с операциями чтения и записи.
Студент узнал про трюк с чтением в одном порядке и записью в другом и попытался его реализовать. Вы найдете его решения:
- На языке Kotlin в файле
src/SolutionTemplateKt.kt
- На языке Java в файле
src/SolutionTemplateJava.java
Однако эти решения не проходят тесты и показывают немонотонное время при чтении.
Возьмите за основу одно из предоставленных решений и скопируйте его в файл src/Solution.(kt|java)
.
Вы должны написать в этом файле реализацию монотонных часов, используя фиксированное число переменных типа RegularInt
для хранения
текущего записанного времени. Использование блокировок и других механизмов синхронизации запрещено. Ваше решение должно поддерживать
весь диапазон потенциальных времен, то есть должно сохранять переданное в функцию write
время как минимум в
трех регулярных целочисленных переменных (но может использовать и больше).
В заголовке строке файла, в строке @author
впишите вашу фамилию и имя.
Для проверки корректности вашего решения запустите ./gradlew build
из корня репозитория.
Один из вариантов решения описан в работе Лампорта Concurrent Reading and Writing of Clocks.