Sto correndo in una situazione in cui ho bisogno della somma atomica di due valori in memoria. Il codice che ho ereditato va come questa:C'è un modo per rendere due letture atomiche?
int a = *MemoryLocationOne;
memory_fence();
int b = *MemoryLocationTwo;
return (a + b) == 0;
L'individuo legge di A e B sono atomiche, e tutte le scritture in altre parti del codice per queste due posizioni di memoria sono lockless anche atomica. Tuttavia il problema è che i valori delle due posizioni possono cambiare e cambiano tra le due letture.
Quindi, come faccio a rendere questa operazione atomica? So tutto di CAS, ma tende a coinvolgere solo le operazioni di lettura-modifica-scrittura atomiche e non è proprio quello che voglio fare qui.
C'è un modo per farlo, o è l'opzione migliore per refactoring del codice in modo che ho solo bisogno di controllare un valore?
Modifica: Grazie, non ho detto che volevo farlo senza chiave nella prima revisione, ma alcune persone lo hanno rilevato dopo la mia seconda revisione. So che nessuno crede alle persone quando dicono cose come queste, ma non posso usare le serrature praticamente. Dovrei emulare un mutex con atomics e sarebbe più lavoro di refactoring del codice per tenere traccia di un valore anziché di due.
Per ora il mio metodo di investigazione consiste nel trarre vantaggio dal fatto che i valori sono consecutivi e li afferrano atomicamente con una lettura a 64 bit, che sono sicuro siano atomici sulle mie piattaforme di destinazione. Se qualcuno ha nuove idee, per favore contribuisci! Grazie.
Capita di essere consecutivi 32 indirizzi bit e processori devo codificare per lavorare su avere atomico a 64 bit leggono se correttamente allineati, così questa sembra la via da seguire. –
Ah, in questo caso puoi scrivere un assembly o semplicemente controllare l'output del tuo compilatore per verificare che l'uso di un tipo a 64 bit farà la cosa giusta. In tal caso, puoi andare in blocco. – Eddie