Sto scrivendo un costruttore di copia per una struttura dati che deve copiare due membri std::atomic<T>
in un nuovo oggetto. Sebbene il processo non debba necessariamente essere atomico nel mio caso d'uso, preferirei avere la soluzione più corretta possibile.Modalità di blocco per la copia atomica nel Copy Manufacturer
Sono consapevole del fatto che il costruttore di copie viene eliminato esplicitamente con std::atomic<T>
in modo da imporre agli utenti di utilizzare l'interfaccia atomica.
atomico (const atomico &) = elimina;
Quello che sto attualmente sto facendo qualcosa di simile:
SomeObject(const SomeObject& other):
_atomic1(other._atomic1.load()),
_atomic2(other._atomic2.load()) {
...
}
Non credo che questa operazione è atomica, né so un modo per fare è così (senza serrature).
C'è un modo per copiare questi valori atomicamente (senza blocchi)?
Non esiste un modo generale per copiare atomicamente due oggetti atomici casuali, se questo è ciò che si sta chiedendo. Aggiungi un mutex se hai effettivamente bisogno di una copia atomica. –
9 volte su 10, la risposta a questa domanda sarà "non hai bisogno di farlo, stai andando su qualunque cosa tu stia facendo nel modo sbagliato". Se la struttura dei dati è una sorta di collezione, ad esempio, avrà già un modo per ottenere i suoi contenuti in un modo sicuro per la concorrenza, e dovresti usarlo. –
@MattTimmermans Questo è un grande punto, anche se la mia domanda è di natura accademica. ** Gli spettatori di questa domanda dovrebbero prendere nota e utilizzare i tipi progettati dagli esperti, se possibile. ** La concorrenza è difficile, quindi se scrivi qualcosa da te, fallo revisionare. –