Ich schreibe einen Kopierkonstruktor für eine Datenstruktur, die zwei std::atomic<T>
Mitglieder in ein neues Objekt kopieren muss. Während der Prozess in meinem Anwendungsfall nicht notwendigerweise atomar sein muss, würde ich es vorziehen, die bestmögliche Lösung zu haben.Nicht blockierende Möglichkeit zum Kopieren von Atomics im Kopierkonstruktor
Ich bin mir bewusst, dass der Kopierkonstruktor explizit mit std::atomic<T>
gelöscht wird, um Benutzer zu zwingen, die atomare Schnittstelle zu verwenden.
atomar (const atomic &) = löschen;
Was ich gerade ich so etwas wie dies tue:
SomeObject(const SomeObject& other):
_atomic1(other._atomic1.load()),
_atomic2(other._atomic2.load()) {
...
}
Ich glaube nicht, dass diese Operation atomar ist, noch weiß ich, ein Weg, dies zu machen ist (ohne Schleusen).
Gibt es eine Möglichkeit, diese Werte atomar (ohne Sperren) zu kopieren?
Es gibt keine allgemeine Möglichkeit, zwei zufällige atomare Objekte atomar zu kopieren, wenn Sie das fragen. Fügen Sie einen Mutex hinzu, wenn Sie tatsächlich eine Atombombe benötigen. –
9 mal von 10, wird die Antwort auf diese Frage sein "Sie müssen das nicht tun. Sie gehen über was auch immer Sie den falschen Weg machen". Wenn die Datenstruktur zum Beispiel eine Art von Sammlung ist, dann wird sie bereits eine Möglichkeit haben, ihren Inhalt in einer gleichrangigen Weise zu erhalten, und Sie sollten diese verwenden. –
@MattTimmermans Das ist ein toller Punkt, obwohl meine Frage akademischer Natur ist. ** Zuschauer dieser Frage sollten, wenn möglich, die von Experten entwickelten Typen zur Kenntnis nehmen und verwenden. ** Nebenläufigkeit ist schwierig. Wenn Sie also selbst etwas schreiben, sollten Sie es einem Peer-Review unterziehen. –