Энтони Уильямс представляет стек без блокировки в Concurrency in Action. Это зависит от следующей структуры данных:
struct counted_node_ptr
{
uintptr_t count;
node* ptr;
};
using atomic_cnp = std::atomic<counted_node_ptr>;
Одной из операций над atomic_cnp
является:
counted_node_ptr increment(atomic_cnp& some_atomic_cnp) {
counted_node_ptr old;
while(!some_atomic_cnp.compare_exchange_weak(old,{old.count+1,old.ptr}));
return old;
}
Цель этой операции должна быть достигнута с помощью LOCK XADD
, однако, как написано, это реализовано как LOCK CMPXCHG16B
в al oop. Преимущество LOCK XADD
заключается в том, что в интерфейс можно добавить функцию без ожидания 'top ()'. Однако я не могу найти способ express это в C ++, используя fetch_add
. Как это может быть достигнуто?
В C ++ 20 можно ли будет получить ссылку atomi c на структуру для синхронизации с ссылкой atomi c на один из ее членов?