Piszę konstruktora kopiowania dla struktury danych, która musi skopiować dwa elementy std::atomic<T>
do nowego obiektu. Chociaż proces ten niekoniecznie musi być atomowy w moim przypadku użycia, wolałbym mieć możliwie najbardziej poprawne rozwiązanie.Nonlocking Way to Copy Atomics in Copy Constructor
Jestem świadomy, że konstruktor kopii został jawnie usunięty z std::atomic<T>
, aby zmusić użytkowników do korzystania z interfejsu atomowego.
atomowa (stała atomowa &) = usuń;
Co Ja obecnie robie tak:
SomeObject(const SomeObject& other):
_atomic1(other._atomic1.load()),
_atomic2(other._atomic2.load()) {
...
}
Nie wierzę, ta operacja jest atomowa, ani nie znam sposób, aby to tak (bez zamków).
Czy istnieje sposób na kopiowanie tych wartości atomowo (bez blokad)?
Nie ma ogólnego sposobu atomowego kopiowania dwóch losowych obiektów atomowych, jeśli o to pytasz. Dodaj muteksa, jeśli rzeczywiście potrzebujesz kopii atomowej. –
9 razy na 10, odpowiedź na to pytanie będzie brzmiała: "nie musisz tego robić, robisz wszystko, co robisz w niewłaściwy sposób". Jeśli struktura danych jest na przykład zbiorem, to będzie już miała sposób na uzyskanie jej zawartości w sposób bezpieczny dla współbieżności i powinieneś go użyć. –
@MattTimmermans Jest to świetny punkt, chociaż moje pytanie ma charakter akademicki. ** Widzowie tego pytania powinni wziąć pod uwagę i używać typów zaprojektowanych przez ekspertów, jeśli to możliwe. ** Współbieżność jest trudna, więc jeśli napiszesz coś sam, sprawdź ją. –