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