text: Рассмотрим lock-free стек: /* Наивная реализация lock-free стека, страдающая проблемой ABA.*/ class Stack { volatile Obj* top_ptr; // // Снимает верхний элемент и возвращает указатель на него. // Obj* Pop() { while(1) { Obj* ret_ptr = top_ptr; if (!ret_ptr) return NULL; Obj* next_ptr = ret_ptr->next; // Если верхний элемент - всё ещё ret, считаем, что никто не менял стек. // (Это утверждение не всегда истинно из-за проблемы ABA) // Атомарно заменяем top на next. if (CompareAndSwap(top_ptr, ret_ptr, next_ptr)) { return ret_ptr; } // Иначе - стек изменён, пробуем заново. } } // // Добавляет obj_ptr на вершину стека. // void Push(Obj* obj_ptr) { while(1) { Obj* next_ptr = top_ptr; obj_ptr->next = next_ptr; // Если верхний элемент - всё ещё next, считаем, что никто не менял стек. // (Это утверждение не всегда истинно, из-за проблемы ABA) // Атомарно заменяем top на obj. if (CompareAndSwap(top_ptr, next_ptr, obj_ptr)) { return; } // Иначе - стек изменён, пробуем заново. } } }; Этот код обычно может предотвращать проблемы с конкурентным доступом, но страдает проблемой ABA.