courses:high_performance_computing:coroutines_map
Differences
This shows you the differences between two versions of the page.
Next revision | Previous revision | ||
courses:high_performance_computing:coroutines_map [2020/06/02 13:19] – created odoronin | courses:high_performance_computing:coroutines_map [2020/06/08 00:58] (current) – odoronin | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | 1 | + | ====== Coroutines Map ====== |
+ | |||
+ | Необходимо реализовать следующий интерфейс lock-free map в стиле coroutines, интерфейс по поведению должен сответстовать [[https:// | ||
+ | |||
+ | <code java> | ||
+ | public interface CoroutinesMap< | ||
+ | /** | ||
+ | * Добавить (key,value) к ассоциативному контейнеру. Если key уже существует, | ||
+ | * | ||
+ | * Алгоритм должен быть как минимум lock-free. | ||
+ | * | ||
+ | * @param key ключ | ||
+ | * @param value значение | ||
+ | * @return вернуть существующее value если key уже существует в множестве, | ||
+ | */ | ||
+ | suspend fun put(key: K, value: V) : V? | ||
+ | |||
+ | /** | ||
+ | * Проверка наличия ключа в множестве | ||
+ | * | ||
+ | * Алгоритм должен быть как минимум wait-free для типов конечной размерноости и lock-free для остальных | ||
+ | * | ||
+ | * @param key значение ключа | ||
+ | * @return значение если элемент содержится в множестве, | ||
+ | */ | ||
+ | suspend fun get(key: K) : V? | ||
+ | |||
+ | /** | ||
+ | * Удалить ключ из ассоциативного контейнера | ||
+ | * | ||
+ | * Алгоритм должен быть как минимум lock-free | ||
+ | * | ||
+ | * @param key значение ключа | ||
+ | * @return вернуть существующее value если key существовал в множестве, | ||
+ | */ | ||
+ | suspend fun remove(key: K) : V? | ||
+ | |||
+ | /** | ||
+ | * Проверка ассоциативного контейнера на пустоту | ||
+ | * | ||
+ | * Алгоритм должен быть как минимум lock-free | ||
+ | * | ||
+ | * @return true если множество пусто, иначе - false | ||
+ | */ | ||
+ | suspend fun isEmpty(): Boolean | ||
+ | |||
+ | /** | ||
+ | * Возвращает lock-free Immutable Set элементов для ассоциативного контейнера. Аналог Iterator из lock-free-set | ||
+ | * | ||
+ | * @return новый экземпляр Set для ассоциативного контейнера. Возвращается полная не изменяемая копия | ||
+ | */ | ||
+ | suspend fun entrySet(): Set< | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | В работе можно использовать только JDK 11 и язык программирования Kotlin. Имя класса реализации CoroutinesMapImpl. В работе нужно доработать lock-free-set из прошлой работы до map и использовать как вложенное поле в CoroutinesMapImpl. Если ваш lock-free-set был написан на java, то можно его импортировать как java файл и доработать до map тоже на языке java, но реализацию CoroutinesMapImpl нужно уже писать на Kotlin. | ||
+ | |||
+ | * В работе должны быть тесты только на работу с корутинами | ||
+ | * Запрещено использовать asCoroutineDispatcher | ||
+ | * Задачи нужно отправлять через submit в Exectuors.fixedThreadPool, | ||
+ | |||
+ | При использовании async действия должны выполняться асинхронно | ||
+ | <code java> | ||
+ | val m = CoroutinesMapImpl< | ||
+ | runBlocking { | ||
+ | val a = async { m.put(" | ||
+ | val b = async { m.put(" | ||
+ | print(a.await()); | ||
+ | print(b.await()); | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | Если не использовать async, то каждое действие будет блокироваться до получения результата | ||
+ | <code java> | ||
+ | val m = CoroutinesMapImpl< | ||
+ | runBlocking { | ||
+ | val a = m.put(" | ||
+ | val b = m.put(" | ||
+ | print(a); | ||
+ | print(b); | ||
+ | } | ||
+ | </ | ||
+ |
courses/high_performance_computing/coroutines_map.1591093163.txt.gz · Last modified: 2020/06/02 13:19 by odoronin