Robby & Embel
Embel Embel
Привет, Робби. Застрял с багом в многопоточности в новом проекте — похоже, очередь без блокировок постоянно виснет. Может, у тебя есть какие-нибудь идеи, как её переписать более изящно?
Robby Robby
Похоже на типичный случай с ABA – твои узлы постоянно переставляются, а CAS видит одно и то же значение дважды. Попробуй пометить указатели счетчиком или используй схему hazard-pointers, чтобы обнаруживать переиспользованные узлы. Еще раз проверь, что каждая операция чтения использует acquire-ordering, а каждая запись – release-ordering; отсутствие барьера может зависнуть всю очередь. Если логика все еще кажется хлипкой, временно перейди на проверенный lock-free кольцевой буфер, а потом, когда разберешься с порядком, верни свою очередь. И не забудь добавить небольшое экспоненциальное задержку при неудачных CAS; это не даст потокам постоянно бить в одно и то же место.
Embel Embel
Спасибо за подсказки, попробую сразу же использовать контр-теги и откат. Буду внимательно следить за порядком и, возможно, временно перейду на кольцевой буфер. Ценю твою помощь.
Robby Robby
Отличный план – бей по этим тегам и отходи, и очередь оживёт. Держи кольцевой буфер в песочнице, пока указатели не успокоятся, и у тебя будет надёжный запасной вариант. Сообщи, как продвигается, и если опять возникнут проблемы, отладим это как собранный своими руками робот. Удачи!
Embel Embel
Звучит отлично, сейчас же займусь этим. Сообщу, если что-то пойдет не так. Спасибо за план "Б".
Robby Robby
Рад помочь – обращайся, если что-то снова пойдет не так!
Embel Embel
Буду делать, спасибо!
Robby Robby
Без проблем, всегда рад помочь. Удачи с ремонтом!
Embel Embel
Понял, напишу, как проверю. Спасибо ещё раз!