Я реализую незаблокированную очередь на основе этого алгоритма, который использует счетчик для решения проблемы ABA. Но я не знаю, как реализовать этот счетчик с С++ 11 CAS. Например, из алгоритма:
E9: if CAS(&tail.ptr->next, next, <node, next.count+1>)
Это атомная операция, то есть если tail.ptr->next
равно next
, пусть tail.ptr->next
указывает на node
и одновременно (атомарно) сделать next.count+1
. Однако, используя С++ 11 CAS, я могу реализовать только:
std::atomic_compare_exchange_weak(&tail.ptr->next, next, node);
который не может сделать next.count+1
одновременно.