Предположим, что мы имеем class
с std::mutex
:Реализация своп для класса с станд :: мьютекс
class Foo
{
std::mutex mutex_;
std::string str_;
// other members etc
public:
friend void swap(Foo& lhs, Foo& rhs) noexcept;
}
Что является подходящим способом для реализации метода swap
здесь? Требуется ли/безопасно блокировать каждый мьютекс отдельно, а затем менять все? например
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
}
Я видел, что в C++ 17, std::lock_guard
будет иметь constructor принимая несколько семафоров для предотвращения тупиковой ситуации, но я не уверен, что это проблема здесь?