La mia prima domanda è: esiste un modo per accedere ai membri di struct in un oggetto atomic<struct>
? Per esempio, ottengo l'errore del compilatore:Malinteso di strutture e puntatori atomici
struct std::atomic<node>’ has no member named ‘data’ a.data = 0;
in questo segmento
struct node{
int data;
node* next;
};
int main(){
atomic<node> a;
a.data = 0;
}
posso lavorare intorno ad esso con la creazione di un nodo temporanea in questo modo:
atomic<node> a;
node temp;
temp.data = 0;
a.store(temp);
ma questo doesn sembra molto elegante
La seconda domanda è: cosa succede se ho un puntatore a un oggetto atomico? È comunque possibile accedere direttamente ai membri del nodo? Ovviamente quanto segue non si compila, come cambierei questo per memorizzare 0 nel valore del nodo in b?
atomic<node> b = new node;
b->data = 0;
Questa è una soluzione che ho trovato, ma ancora una volta, c'è un modo più elegante di farlo ??
atomic<node> *b;
node temp;
temp.data = 0;
b->store(&temp);
E, infine, qual è la differenza tra atomic<node*>
e atomic<node>*
No, c'è solo un insieme limitato di operazioni atomiche (carico, memorizzazione, scambio, ...) –
'atomico' applica l'aggiornamento atomico del puntatore che tiene (non la cosa a cui punta il puntatore, solo il puntatore). 'atomic *' è un puntatore a un 'atomico ', il cui scopo è quello di forzare l'aggiornamento atomico dell'oggetto 'node'. –
Barry
Se si desidera una struttura in cui è possibile aggiornare atomicamente * entrambi i membri insieme, o modificarne separatamente uno atomicamente (senza un confronto_exchange_weak sull'intera struttura), è possibile utilizzare [un'unione di una struttura atomica e una struttura con due atomici membri] (http://stackoverflow.com/questions/38984153/implement-aba-counter-with-c11-cas/38991835#38991835). (Se stai usando un compilatore C++ che garantisce che scrivere un membro del sindacato e poi leggerne un altro è ok, come nel C99). Questo in effetti funziona (in modo efficiente) per le strutture fino alla dimensione massima che l'hardware può utilizzare in cmpxchg, ovvero 16B su x86-64. –