В этом задании вам необходимо реализовать алгоритм для 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