std::lock
не RAII. Замки мьютекса не в RAII опасны и страшны. Если выдается исключение, вы можете «утечь» блокировку.
std::lock_guard
не поддерживает безопасную блокировку нескольких мьютексов. Но это RAII, поэтому он делает остальную часть кода более безопасной. Если вы заблокируете a затем b в одном месте, а b затем a в другом, вы получите код, который может завести блокировку (один поток удерживает a и ожидает b, а другой поток удерживает b и ожидает a).
std::lock
гарантированно избежит этого каким-либо неуказанным способом (который может включать глобальный порядок блокировок).
std::scoped_lock
- это c ++ 17 . В c ++ 17 это то, что вы должны использовать вместо примера кода, который вы показали. Это было добавлено, потому что написание этого кода отстой. Из-за проблем, связанных с искажением имен и связыванием, было просто невозможно добавить поддержку variardic в существующие блокирующие примитивы, такие как lock guard, поэтому у него другое имя.