Изменения

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

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

1975 байт добавлено, 19:16, 1 октября 2018
Нет описания правки
'''break'''
При этом данной реализации мы сталкиваемся со следующей проблемой == Описание проблемы == Рассмотрим ситуацию, при которой два потока <tex>A</tex> и <tex>B</tex> добавляют в очередь элементы <tex>6</tex> и <tex>7</tex>. Рассмотрим следующую последовательность действий: # Поток <tex>A</tex> добавляет в очередь новую вершину, изменяя <tex>T.next</tex>, но не успевает изменить <tex>T</tex> так, чтобы он указывал на только что добавленную вершину.# Планировщик операционной системы усыпляет поток <tex>A</tex>.# Поток <tex>B</tex> собирается добавить новую вершину в очередь, но не может этого сделать, так как постоянно проваливает операцию <tex>CAS(T.next, null, newTail)</tex> (T.next не указывает на <tex>null</tex>, так как поток <tex>A</tex> на шаге <tex>1</tex> добавил в очередь новую вершину, но не передвинул <tex>T</tex>)# Поток <tex>B</tex> не сможет добавить в очередь новую вершину (а следовательно, завершить операцию <tex>push</tex>), до тех пор, пока планировщик операционной системы не разбудит поток <tex>A</tex>, и поток <tex>A</tex> не завершит добавление (то есть не передвинет <tex>T</tex> на вершину, добавленную на шаге <tex>1</tex>.) Следовательно, у такой очереди нет гарантии прогресса, и этот алгоритм не lock-free. == Корректная lock-free реализация ==
==Примечания==
Анонимный участник

Навигация