scoped_lock — std::scoped_lock

scoped_lock — std::scoped_lock

std::scoped_lock 클래스는 스코프 블록 동안 0개 이상의 뮤텍스를 소유하기 위한 편리한 RAII-스타일 메커니즘을 제공하는 뮤텍스 래퍼예요. C++17에서 도입됐어요. <mutex> 헤더에 있어요.

scoped_lock 객체가 생성되면 뮤텍스들을 잠그고, 파괴되면 해제해요.

출처: cppreference

본문

// <mutex> 헤더, C++17
template< class... MutexTypes >
class scoped_lock;

사용 예 — 여러 뮤텍스 한 번에

#include <mutex>

std::mutex m1, m2;

void f() {
    // 두 뮤텍스를 한 번에 (데드락 회피) 잠그고, scope 끝에서 자동 해제
    std::scoped_lock lk(m1, m2);
    // m1과 m2 보호 영역
}

std::scoped_lockstd::lockstd::lock_guard의 조합으로, 여러 뮤텍스를 한 번에 안전하게 잠가 데드락을 피하고 RAII로 자동 해제해요.

단일 뮤텍스

std::mutex m;
void g() {
    std::scoped_lock lk(m);   // lock_guard 대체 가능
    // ...
}

CTAD (클래스 템플릿 인자 추론)

C++17부터 std::scoped_lock lk(m1, m2);처럼 템플릿 인자를 생략할 수 있어요.

std::scoped_lock<std::mutex, std::mutex> explicit_lk(m1, m2);  // 명시
std::scoped_lock lk(m1, m2);   // 추론 (간결)

특징

  • 여러 뮤텍스 동시 잠금 — 생성자에서 std::lock(*mutexes...)을 호출해 데드락을 회피해요.
  • RAII — 소멸자에서 역순으로 해제.
  • 복사·이동 불가.
// m3까지 잠그려면
std::scoped_lock lk(m1, m2, m3);

std::scoped_lock은 여러 또는 단일 뮤텍스의 안전한 잠금·자동 해제를 위한 C++17의 권장 도구예요.

더 알아보기 (Learn more)

cppreference