Jump to content

Указатель опасности

В многопоточной вычислительной среде указатели опасностей являются одним из подходов к решению проблем, возникающих при динамическом управлении памятью узлов в без блокировок структуре данных . Эти проблемы обычно возникают только в средах, где нет автоматической сборки мусора . [1]

Любая структура данных без блокировок, использующая примитив сравнения и замены, должна решать проблему ABA . Например, в стеке без блокировок, представленном как навязчиво связанный список, один поток может пытаться извлечь элемент из начала стека (A → B → C). Он запоминает второе сверху значение «B», а затем выполняет compare_and_swap(target=&head, newvalue=B, expected=A). К сожалению, в середине этой операции другой поток мог выполнить два извлечения, а затем поместить A обратно на вершину, в результате чего образовался стек (A → C). Операция сравнения и замены успешно заменяет `head` на `B`, и в результате стек теперь содержит мусор (указатель на освобожденный элемент "B").

Более того, любой алгоритм без блокировок, содержащий код вида

    Node* currentNode = this->head;  // assume the load from "this->head" is atomic
    Node* nextNode = currentNode->next;  // assume this load is also atomic

страдает еще одной серьезной проблемой — отсутствием автоматической сборки мусора. Между этими двумя строками возможно, что другой поток может извлечь узел, на который указывает this->head и освободить ее, то есть доступ к памяти через currentNode во второй строке читается освобожденная память (которая на самом деле может уже использоваться каким-то другим потоком для совершенно другой цели).

Указатели опасностей могут использоваться для решения обеих этих проблем. В системе указателей опасностей каждый поток хранит список указателей опасностей, указывающий, к каким узлам поток обращается в данный момент. (Во многих системах этот «список», вероятно, может быть ограничен только одним [1] [2] или два элемента.) Узлы в списке указателей опасности не должны изменяться или освобождаться каким-либо другим потоком.

Каждый поток чтения имеет общий указатель с одним записывающим/множественным чтением, называемый «указателем опасности». Когда поток чтения присваивает адрес карты своему указателю опасности, он, по сути, объявляет другим потокам (писателям): «Я читаю эту карту. Вы можете заменить ее, если хотите, но не меняйте ее содержимое и, конечно же, не меняйте ее. держи свой deleteруки прочь от этого».

Андрей Александреску и Мэджид Майкл, Структуры данных без блокировки с указателями на опасность [2]

Когда поток хочет удалить узел, он помещает его в список узлов, «которые будут освобождены позже», но фактически не освобождает память узла до тех пор, пока ни один из других потоков не содержит указатель опасностей. Эту ручную сборку мусора можно выполнить с помощью выделенного потока сборки мусора (если список «подлежащего освобождению позже» является общим для всех потоков); в качестве альтернативы очистка списка «подлежащего освобождению» может выполняться каждым рабочим потоком как часть такой операции, как «pop» (в этом случае каждый рабочий поток может нести ответственность за свой собственный список «подлежащего освобождению»).

В 2002 году Мэгед Майкл из IBM подал заявку на получение патента США на метод указателя опасности. [3] но заявка была отклонена в 2010 году.

Альтернативой указателям опасности является подсчет ссылок . [1]

См. также

[ редактировать ]
  1. ^ Jump up to: а б с Энтони Уильямс. Параллелизм C++ в действии: практическая многопоточность. Manning: Shelter Island, 2012. См., в частности, главу 7.2, «Примеры структур данных без блокировок».
  2. ^ Jump up to: а б Андрей Александреску и Магед Майкл (2004). «Блокировочные структуры данных с указателями на опасность» . Доктор Добб . (статья, ориентированная на C++)
  3. ^ Заявка США 20040107227   Мэджид М. Майкл, «Метод эффективной реализации динамических структур данных без блокировок с безопасным восстановлением памяти». Подано 3 декабря 2002 г.
[ редактировать ]
Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: fe48e5a5491b3fa3d6717a1cd1897c12__1721200680
URL1:https://arc.ask3.ru/arc/aa/fe/12/fe48e5a5491b3fa3d6717a1cd1897c12.html
Заголовок, (Title) документа по адресу, URL1:
Hazard pointer - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)