Первый вопрос: есть ли способ доступа к членам структуры в объекте atomic<struct>
? Например, я получаю ошибку компиляции:Непонимание атомных структур и указателей
struct std::atomic<node>’ has no member named ‘data’ a.data = 0;
в этом сегменте
struct node{
int data;
node* next;
};
int main(){
atomic<node> a;
a.data = 0;
}
Я могу работать вокруг него, создавая временный узел, как так:
atomic<node> a;
node temp;
temp.data = 0;
a.store(temp);
но это Безразлично Кажется очень элегантным.
Второй вопрос: что, если у меня есть указатель на атомный объект? Есть ли вообще доступ к элементам узла напрямую? Очевидно, что следующее не компилируется, как бы изменить это, чтобы сохранить 0 в значении узла в точке b?
atomic<node> b = new node;
b->data = 0;
Это решение, которое я нашел, но опять же, есть ли более элегантный способ сделать это?
atomic<node> *b;
node temp;
temp.data = 0;
b->store(&temp);
И, наконец, в чем разница между atomic<node*>
и atomic<node>*
Нет, существует только ограниченный набор атомных операций (загрузка, хранение, обмен, ...). –
'atomic' обеспечивает атомное обновление указателя, который он удерживает (не то, на что указывает указатель, указатель). 'atomic *' - указатель на атомный ', целью которого является принудительное атомное обновление объекта' node'. –
Barry
Если вам нужна структура, в которой вы можете атомически обновлять * оба * члена вместе или отдельно атомарно изменять один из них (без compare_exchange_weak на всей структуре), вы можете использовать [объединение атомной структуры и структуры с двумя атомарными члены] (http://stackoverflow.com/questions/38984153/implement-aba-counter-with-c11-cas/38991835#38991835). (Если вы используете компилятор C++, который гарантирует, что запись одного члена объединения, а затем чтение другого - это нормально, как в C99). Это фактически работает (эффективно) для структур с максимальным размером, которое может иметь аппаратное обеспечение cmpxchg, то есть 16B на x86-64. –