В этом задании вам необходимо реализовать алгоритм для synchronous queue, который основан на очереди Michael и Scott. Исходную работу вы можете найти по этой ссылке.
В отличие от реализации в Java (см. класс java.util.concurrent.SynchronousQueue
),
мы будем реализовывать этот алгоритм для корутин, использую соответствующий механизм
для засыпания и пробуждения. Смотрите класс SynchronousQueueSequential
в SynchronousQueueTest.kt
в качестве примера.
В файле src/SynchronousQueue.kt
находится описание интерфейса synchronous queue,
который вам предстоит реализовать. Ваше решение должно быть в файле src/SynchronousQueueMS.kt
.
Используйте j.u.c.atomic.AtomicReference
для общих переменных между потоками, на которых необходимо выполнять операцию CAS
.
При реализации алгоритма вам может потребоваться начать всю операцию заново после вызова coroutineSuspend
,
вы можете выразить эту логику следующим образом:
val res = suspendCoroutine<Any> sc@ { cont ->
...
if (shouldRetry()) {
cont.resume(RETRY)
return@sc
}
...
}
if (res === RETRY) continue
Для проверки вашего решения запустите из корня репозитория:
./gradlew build
на Linux или MacOSgradlew build
на Windows