Как вы синхронизируете операцию над структурой с операциями над ее членами? - PullRequest
4 голосов
/ 07 февраля 2020

Энтони Уильямс представляет стек без блокировки в 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 на один из ее членов?

...