Я ищу интересные примеры ABA-проблемы, вызывающие проблемы с многопоточным кодом.
Проблема ABA возникает в параллельном коде при выполнении атомной команды сравнения и замены. Если поток прерывается непосредственно перед выполнением сравнения и свопинга, второй поток может изменить изменение цели сравнения и свопинга от его начального значения А до другого значения B. Если он затем изменяет значение обратно на A до возобновления первого потока, сравнение и обмен будут успешными, несмотря на изменения целевого значения.
Во многих случаях ABA не является проблемой. Возьмите общий счетчик ссылок, например: Даже если пересчет будет изменен одновременно, у нас нет проблемы, если мы никогда не увеличимся с пересчета, который уже упал до 0. Таким образом, нас явно интересует только то, соответствует ли цель ожидаемое значение на момент свопа, а не то, изменилось ли оно в прошлом.
Страница wikipedia содержит пример реализации стека блокировки, который страдает от ABA, но я лично не сталкивался с проблемой в производственный код. Мне было просто любопытно, есть ли у кого-нибудь хорошие истории о войне, чтобы рассказать об АБА.