Skip to content

Latest commit

 

History

History

monotonic-clock

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

Монотонные часы

В рамках данного задания необходимо реализовать алгоритм монотонных часов на регулярных регистрах.

В файле 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, который моделирует регулярный регистр с операциями чтения и записи.

Вася Пупкин узнал про трюк с чтением в одном порядке и записью в другом и попытался его реализовать. Вы найдете его решения:

Однако, Васины решения не проходят тесты и показывают немонотонное время при чтении.

Задание

Возмите за основу одно из предоставленных решений Васи Пупкина и скопируйте его в файл src/Solution.(kt|java). Вы должны написать в этом файле реализую монотонных часов, используя фиксированное число переменных типа RegularInt для хранения текущего записанного времени. Использование блокировок и других механизмов синхронизации запрещено. Ваше решение должно поддерживать весь диппазон потенциальных времен, то есть должно сохранять переданное в функцию write время как минимум в трех регулярных целочисленных переменных (но может использовать и больше).

Для проверки корректности вашего решения запустите ./gradlew run из корня репозитория.

Один из вариантов решения описан в работе Лесли Лампорта Concurrent Reading and Writing of Clocks.

Формат сдачи

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