Supponiamo di avere un class
con un std::mutex
:Implementazione di swap per classe con std :: mutex
class Foo
{
std::mutex mutex_;
std::string str_;
// other members etc
public:
friend void swap(Foo& lhs, Foo& rhs) noexcept;
}
Qual è il modo adeguato per implementare il metodo swap
qui? È necessario/sicuro bloccare ogni mutex separatamente e quindi scambiare tutto? per esempio.
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
}
ho visto che in C++ 17, std::lock_guard
avrà un constructor che assumevano più mutex per evitare situazione di stallo, ma non sono sicuro se questo è un problema qui?