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을 우선 사용해요.

더 알아보기 (Learn more)

cppreference