Энтони Уильямс: C++. Практика многопоточного программирования
https://en.cppreference.com/w/cpp/thread
Вы не блокируете тред, вы блокируете мьютекс. Если мьютекс уже заблокирован другим потоком, то второй тред будет ждать пока освободится мьютекс и потом его заблокирует. Ожидание будет происходить непосредственно в методе lock мьютекса. Есть вариант try_lock - когда ожидания не происходит, но если мьютекс уже захвачен кем-то, то возвращается соответствующая ошибка.
В общем случае применение мьютекса выглядит так:
m.lock()
<unsafe operation>
m.unlock()
Конструкторы можно не удалять, просто в них нужно блокировать мьютекс объекта источника. Мьютекс объекта назначения блокировать не нужно, т.к. это конструктор и класс только создается и им пока еще никто не владеет, так что доступ к членам класса будет монопольный. Но в этих конструкторах надо создавать новые мьютексы для объекта назначения.