Załóżmy, że mamy class
z std::mutex
:swapowych dla klasy wykonawcze w std :: mutex
class Foo
{
std::mutex mutex_;
std::string str_;
// other members etc
public:
friend void swap(Foo& lhs, Foo& rhs) noexcept;
}
Co jest właściwym sposobem wdrożenia metody swap
tutaj? Czy jest wymagane/bezpieczne zablokowanie każdego muteksu osobno, a następnie zamiana wszystkiego? na przykład
void swap(Foo& lhs, Foo& rhs) noexcept
{
using std::swap;
std::lock_guard<std::mutex> lock_lhs {lhs.mutex_}, lock_rhs {rhs.mutex_};
swap(ls.str_, rhs.str_);
// swap everything else
}
Widziałem, że w C++ 17, std::lock_guard
będzie miał constructor robienia wielu muteksy unikania impasu, ale nie jestem pewien, czy to jest problem tutaj?