Ответ 1
Да, вы можете использовать std::unique_lock
с std::defer_lock
. Он сообщает уникальному_блоку, чтобы он не блокировал мьютекс немедленно, а для создания обертки RAII.
std::unique_lock<std::mutex> lk1(mutex1, std::defer_lock);
std::unique_lock<std::mutex> lk2(mutex2, std::defer_lock);
std::lock(lk1, lk2);
Из-за своей вариационной природы std::lock
не привязан к двум аргументам, но может использоваться с таким количеством аргументов, как поддержка вашего компилятора.
Ховард Хиннант также отметил интересный факт о производительности, вы можете проверить эту ссылку, если вы заинтересованы. Он рассматривает проблемы производительности и показывает, что std::lock
можно эффективно реализовать, я также могу рекомендовать прочитать все комментарии в этом сообщении.