barrier — std::barrier
barrier — std::barrier
std::barrier 클래스 템플릿은 알려진 크기의 스레드 그룹이 모두 장벽에 도달할 때까지 그 그룹을 막는 스레드 조정 메커니즘이에요. C++20에서 도입됐어요. <barrier> 헤더에 있어요.
std::latch와 달리, 장벽은 재사용 가능해요 — 한 번의 도달 후에도 다시 사용할 수 있어요.
출처: cppreference
본문
// <barrier> 헤더, C++20
template< class CompletionFunction = /* see below */ >
class barrier;
사용 예 — 반복 동기화
#include <barrier>
#include <thread>
#include <vector>
#include <iostream>
int main() {
const int n = 3;
std::barrier sync(n); // 3개 스레드
std::vector<std::thread> threads;
for (int t = 0; t < n; ++t) {
threads.emplace_back([&, t] {
for (int round = 0; round < 2; ++round) {
// 각 스레드가 자기 작업 수행
std::cout << "thread " << t << " round " << round << '\n';
sync.arrive_and_wait(); // 모두 도달할 때까지 대기
}
});
}
for (auto& th : threads) th.join();
}
주요 연산
| 연산 | 설명 |
|---|---|
arrive_and_wait() |
도달하고 기다림 (장벽 해제 시까지) |
arrive(n) |
단순 도달 (대기 없음) |
wait() |
장벽 해제까지 대기 |
arrive_and_drop() |
도달하고 참여자 수 감소 |
특징
- 재사용 가능 —
latch와 달리 장벽이 해제된 후에도 다시 사용할 수 있어요. - 선택적으로 **완료 함수(CompletionFunction)**가 장벽 단계가 끝날 때 실행돼요.
- 반복·단계별(라운드) 병렬 알고리즘 동기화에 적합해요.
// 완료 함수 예
std::barrier sync{n, [] {
std::cout << "round finished\n";
}};
std::barrier는 반복 병렬 루프(라운드 동기화)에서 스레드를 정렬할 때 유용해요. latch는 1회성, barrier는 재사용이 핵심 차이예요.