Single word CAS tagged pointer for algorithms susceptible to the ABA problem
It's just a spin lock. If the thread that invalidated of the tag got suspended right after, no other thread can make progress till the thread is resumed and releases the tag.

if (old_tag &amp; INVALIDATED) {
    return false; // no thread can go further if ...
}
if (tag.compare_exchange_strong(old_tag, old_tag | INVALIDATED, 
                                std::memory_order_acquire)) {
    ptr = newptr; // &lt;-- ... a thread is preempted here
    tag.store(old_tag + 2, std::memory_order_release);
    return true;
}


So the solution is not lock-free.