Skip to content

Latest commit

 

History

History

synchronous-queue

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 

Synchronous Queue

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