lock — std::lock
lock — std::lock (여러 락)
std::lock은 주어진 여러 Lockable 객체 lock1, lock2, ..., lockn을 데드락 회피 알고리즘으로 잠가는 함수예요. C++11에서 도입됐어요. <mutex> 헤더에 있어요.
객체들은 지정되지 않은 순서로 잠겨요 (데드락을 피하도록).
출처: cppreference
본문
// <mutex> 헤더, C++11
template< class Lockable1, class Lockable2, class... LockableN >
void lock( Lockable1& lock1, Lockable2& lock2, LockableN&... lockn );
여러 뮤텍스를 한 번에 안전하게 잠가요. 개별 lock()으로 여러 개를 잠그면 중간에 데드락이 날 수 있어요.
사용 예 — 여러 뮤텍스 잠금
#include <mutex>
#include <thread>
std::mutex m1, m2;
void transfer() {
// 두 뮤텍스를 데드락 없이 잠금
std::lock(m1, m2);
// 두 뮤텍스 소유
// ... 동시 접근하는 자원 조작
m1.unlock();
m2.unlock();
}
std::lock(m1, m2)와 std::lock(m2, m1)을 서로 다른 스레드가 해도 데드락이 나지 않아요 — 이 함수가 순서를 조율하기 때문이에요.
std::scoped_lock과의 관계
C++17부터는 더 간편하게 std::scoped_lock이 이 역할을 RAII로 해요.
// C++17: RAII + 여러 뮤텍스
std::scoped_lock lk(m1, m2); // 잠그고 자동 해제
특징
- 데드락 회피 — 여러 뮤텍스를 걸 때 잠금 순서 충돌로 인한 데드락을 방지.
- 하나라도 잠금에 실패하면, 이미 잠근 것은 예외 안전하게 해제해요.
std::scoped_lock(C++17)이 더 권장되는 방식이에요.
// 전통적 방식
std::lock(m1, m2);
std::lock_guard<std::mutex> l1(m1, std::adopt_lock);
std::lock_guard<std::mutex> l2(m2, std::adopt_lock);
std::lock은 여러 뮤텍스를 동시에 잡아 데드락을 피해야 하는 시나리오에서 유용해요. 새 코드는 std::scoped_lock을 우선 사용해요.