
Hazard pointers на пальцах
cppmage 18 минут назад Hazard pointers на пальцах Средний 5 мин 793 C++ * Системное программирование * Высоконагруженные системы * Программирование * Туториал Из песочницы Привет, Хабр.Я потратил кучу времени на...
Anthropic — What company has the best second artificial intelligence model at the end of June?
Значимый прорыв формирует отрасль ИИ: cppmage 18 минут назад Hazard pointers на пальцах Средний 5 мин 793 C++ * Системное программирование * Высоконагруженные системы * Программирование * Туториал Из песочницы Привет, Хабр. Я потратил кучу времени на прочтение статей и книжек про эти указатели, много комплексного текста и мало схемок и примеров, а как по мне, они упрощают в разы понимание. Буду называть «Hazard pointers» как «Хазарды».
Тут я не буду вдаваться в детали и теорию про memory ordering, а буду стараться сформировать «прикладное» понимание вопроса. Эта статья больше как поверхностное введение, например для параграфа про одноименные указатели в «C++ Concurrency in Action» от Энтони Уильямса, нежели что‑то на чем стоит останавливаться слишком надолго. Перво‑наперво, Хазарды позволяют безопасно освобождать память.
Технические детали
Заодно они решают и ABA‑проблему — пока поток держит указатель в своём HP, этот узел никто не удалит и его адрес не переиспользует. Нужда в первом возникает, когда больше одного потока работают с структурой. Например поток X взял указатель на вершину стэка → X засыпает → поток Y удаляет это вершину → X просыпается и читает значение по удаленному адресу.
Ну а на счет ABA проблемы. Что‑же это такое и когда она возникает? Сперва стоит понимать, что она появляется в алгоритмах, где используется CAS, например Lock‑free стэк.
Допустим у нас 2 потока X и Y. X: заходит в функцию стэка X: берет указатель на верхний элемент структуры и считывает значение X: Засыпает по воле планировщикаY: выталкивает текущую вершину Y: кладет новый элемент в стэк, но оказалось, что этот новый узел имеет тот же адрес, потому что память от удалённого узла была переиспользована аллокаторомX: через CAS проверяет что текущий узел лежит по тому же адресу, успех и возвращает значение, которое уже было удаленоЭто гадкая проблема, она приводит к инвалидации структуры, так и к её полному разрушению или даже завершению процесса. Теперь перейдем к самим Хазардам, как бы нам решить эти проблемы?
Отраслевые последствия
Перечислим, что нам надо:Понимать, что эту вершину удалять сейчас нельзяКак‑то откладывать удаление и производить его, когда никто не держит эту вершинуИз этого следует, что нам нужен общий менеджер, который курирует всеми хазардами, удаляет ненужные и запоминает те, что еще используются кем‑то. Этим условиям соответствует данная схема. Hazard Pointers Architecture В данной архитектуре каждый поток держит у себя hp_ptr(указатель), с которым он работает.
Этот указатель могут читать другие потоки. Также имеется личный retired_list, в который он складывает то, что надо будет удалить. Вектор all_records держит указатели на эти хранилища, чтобы каждый поток мог прочитать их.
Число потоков может быть любым.
Событие, по словам экспертов, усилит конкуренцию в сфере ИИ.





