Giả sử chúng ta có một class
với một std::mutex
:Thực hiện hoán đổi cho lớp học với std :: mutex
class Foo
{
std::mutex mutex_;
std::string str_;
// other members etc
public:
friend void swap(Foo& lhs, Foo& rhs) noexcept;
}
cách thích hợp để thực hiện các phương pháp swap
ở đây là gì? Có cần thiết/an toàn để khóa mỗi mutex riêng biệt và sau đó trao đổi tất cả mọi thứ? ví dụ.
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
}
I have seen that trong C++ 17, std::lock_guard
sẽ có một constructor uống nhiều loại mutexes để tránh bế tắc, nhưng tôi không chắc chắn nếu đó là một vấn đề ở đây?