Конструктор Threadsafe(Threadsafe other) недопустим как копирующий, а std::mutex нельзя копировать или присваивать. Для копирования данных нужен новый mutex и согласованный снимок other.
struct Threadsafe
Конструктор Threadsafe(Threadsafe other) недопустим как копирующий, а std::mutex нельзя копировать или присваивать. Для копирования данных нужен новый mutex и согласованный снимок other.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
struct Threadsafe { Threadsafe() = default; Threadsafe(Threadsafe other){ this->mutex = other.mutex; }
std::mutex mutex;
A a;
B b;
// ...
};
Ответ
Конструктор Threadsafe(Threadsafe other) недопустим как копирующий, а std::mutex нельзя копировать или присваивать. Для копирования данных нужен новый mutex и согласованный снимок other.
Если копирование вообще не нужно, явно удалите copy-конструктор и оператор присваивания. Если нужно — принимайте const Threadsafe&, создавайте собственный mutex и копируйте a/b под блокировкой источника; mutex для блокировки const-источника обычно делают mutable.
Способ инициализации a/b зависит от их конструкторов: присваивание в теле не подходит недефолтно-конструируемым типам, тогда нужен отдельный snapshot/helper. Для присваивания блокируют оба объекта без deadlock, учитывают self-assignment и исключения. Само имя Threadsafe не обеспечивает безопасность доступа к публичным a/b.