Изменения

Перейти к: навигация, поиск

Очередь Майкла и Скотта

78 байт добавлено, 18:04, 1 октября 2018
Многопоточная реализация
'''def''' pop(): '''Int'''
'''while ''' ('''true'''): <font color=green>//Поток пытается в CAS - цикле поменять указатель на H, пока не получится</font>
head = H.get()
if (head.next == null):
'''throw''' ''' new ''' EmptyException()
newHead = head.next.get()
if ('''CAS'''(H, head, nextHead)): '''return ''' newHead.data
=== Добавление элемента ===
'''def''' push(x: '''Int'''):
newTail = '''new''' Node(x, '''new''' AtomicReference<Node>(null))
'''while ''' ('''true'''): <font color=green>//Поток пытается в CAS - цикле поменять T.next, пока не получится</font>
tail = T.get()
curTail = tail.next
if ('''CAS'''(curTail, null, newTail)): <font color=green>//Поток пытается добавить элемент в конец очереди</font> '''break''' '''while ''' ('''true'''): <font color=green>//Поток пытается в CAS - цикле поменять указатель на T, пока не получится</font>
tail = T.get()
nextTail = tail.next.get()
if ('''CAS'''(T, tail, nextTail)): '''break'''
При этом мы сталкиваемся со следующей проблемой
Анонимный участник

Навигация