Как отмечают различные комментаторы, прочитавшие код реализации стандартной библиотеки C ++: да, использование std::shared_mutex
, заключенного в std::shared_lock()
, в качестве одного из аргументов std::scoped_lock()
является безопасным.
По сути, std::shared_lock
перенаправляет все вызовы на lock()
на lock_shared()
на мьютексе.
std::shared_lock::lock -----------> mutex()->lock_shared(). // same for try_lock etc..
Другое возможное решение
std::shared_lock lk1(src.mutex, std::defer_lock);
std::unique_lock lk2(dst.mutex, std::defer_lock);
std::lock(lk1, lk2);
std::lock
- это функция, которая принимает любое количество объектов Lockable
и блокирует их все (или прерывает, за исключением исключения, в этом случае они все будут разблокированы).
std::scoped_lock
в соответствииto cppreference - это оболочка для std::lock
, с дополнительным функционалом вызова unlock()
для каждого объекта Lockable в его деструкторе.Эта дополнительная функциональность здесь не требуется, так как std::shared_lock lk1
и std::unique_lock lk2
также работают в качестве защитных устройств блокировки, которые разблокируют свои мьютексы, когда они выходят из области видимости.
Редактировать: различные уточнения