latch — std::latch

latch — std::latch

std::latch 클래스는 스레드를 동기화하는 데 사용할 수 있는 std::ptrdiff_t 타입의 아래로 내려가는(downward) 카운터예요. C++20에서 도입됐어요. <latch> 헤더에 있어요.

카운터 값은 생성 시 초기화돼요. 스레드는 카운터가 0으로 감소할 때까지 latch에서 블로킹할 수 있어요. 카운터를 증가시키거나 리셋할 방법은 없어요 — 1회성 동기화예요.

출처: cppreference

본문

// <latch> 헤더, C++20
class latch;

사용 예 — 여러 작업 완료 대기

#include <latch>
#include <thread>
#include <vector>

int main() {
    const int n = 4;
    std::latch done(n);          // 4번 arrive해야 열림

    std::vector<std::thread> threads;
    for (int i = 0; i < n; ++i) {
        threads.emplace_back([&, i] {
            // 작업 수행
            done.count_down();   // 카운트 감소
        });
    }
    done.wait();                 // 카운터가 0이 될 때까지 대기
    // 모든 작업 완료
    for (auto& t : threads) t.join();
}

주요 연산

연산 설명
count_down(n) 카운터를 n만큼 감소
arrive_and_wait() 감소하고 0까지 대기
wait() 0이 될 때까지 대기
try_wait() 즉시 확인
max() 최대 카운터 값

latch vs barrier

  • latch — 1회성. 카운터가 0이 되면 끝. 재사용 불가.
  • barrier — 재사용 가능. 여러 라운드 동기화 가능.
// 일회성 완료 신호
std::latch ready{1};
// ... worker가 count_down하면
ready.wait();   // 열림

std::latch는 "N개의 스레드/작업이 모두 끝날 때까지 기다리는" 1회성 배리어 역할로 쓰여요. 초기화가 간단하고 특정 목표 지점에 도달하는 것을 동기화하는 데 적합해요.

더 알아보기 (Learn more)

cppreference