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회성 배리어 역할로 쓰여요. 초기화가 간단하고 특정 목표 지점에 도달하는 것을 동기화하는 데 적합해요.