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는 재사용이 핵심 차이예요.

더 알아보기 (Learn more)

cppreference