Namespaces
Variants

std:: barrier

From cppreference.net
Concurrency support library
Threads
(C++11)
(C++20)
this_thread namespace
(C++11)
(C++11)
Cooperative cancellation
Mutual exclusion
Generic lock management
Condition variables
(C++11)
Semaphores
Latches and Barriers
(C++20)
barrier
(C++20)
Futures
(C++11)
(C++11)
(C++11)
Safe reclamation
Hazard pointers
Atomic types
(C++11)
(C++20)
Initialization of atomic types
(C++11) (deprecated in C++20)
(C++11) (deprecated in C++20)
Memory ordering
(C++11) (deprecated in C++26)
Free functions for atomic operations
Free functions for atomic flags
헤더에 정의됨 <barrier>
template < class CompletionFunction = /* see below */ >
class barrier ;
(C++20부터)

클래스 템플릿 std::barrier 는 알려진 크기의 스레드 그룹이 배리어에 도달할 때까지 해당 그룹의 모든 스레드를 차단하는 스레드 조정 메커니즘을 제공합니다. std::latch 와 달리, 배리어는 재사용 가능합니다: 도착한 스레드 그룹이 차단 해제되면 배리어를 다시 사용할 수 있습니다. std::latch 와 달리, 배리어는 스레드를 차단 해제하기 전에 가능적으로 비어 있을 수 있는 호출 가능 객체를 실행합니다.

배리어 객체의 수명은 하나 이상의 단계로 구성됩니다. 각 단계는 대기 스레드가 차단하는 단계 동기화 지점 을 정의합니다. 스레드는 배리어에 도착할 수 있지만, arrive 를 호출하여 단계 동기화 지점 에서의 대기를 지연할 수 있습니다. 이러한 스레드는 나중에 wait 를 호출하여 단계 동기화 지점 에서 차단될 수 있습니다.

배리어 phase 는 다음 단계들로 구성됩니다:

  1. 예상 카운트 arrive 또는 arrive_and_drop 호출 시마다 감소합니다.
  2. 예상 카운트가 0에 도달하면 페이즈 완료 단계 가 실행됩니다. 즉, completion 이 호출되고 페이즈 동기화 지점에서 대기 중인 모든 스레드의 차단이 해제됩니다. 완료 단계의 종료는 강력하게 선행합니다 완료 단계에 의해 차단 해제된 모든 호출의 반환 시점에.
    예상 카운트가 0에 도달한 후 정확히 한 번, 하나의 스레드가 arrive , arrive_and_drop , 또는 wait 호출 중에 완료 단계를 실행합니다. 단, 어떤 스레드도 wait 를 호출하지 않을 경우 완료 단계 실행 여부는 구현에 따라 정의됩니다.
  3. 완료 단계가 종료되면, 예상 카운트는 생성 시 지정된 값에서 이후 발생한 arrive_and_drop 호출 횟수를 뺀 값으로 재설정되고, 다음 배리어 페이즈 가 시작됩니다.

barrier 의 멤버 함수들(소멸자 제외)의 동시 호출은 데이터 경쟁을 발생시키지 않습니다.

목차

템플릿 매개변수

CompletionFunction - 함수 객체 타입
-
CompletionFunction MoveConstructible Destructible 요구사항을 충족해야 합니다. std:: is_nothrow_invocable_v < CompletionFunction & > true 여야 합니다.

CompletionFunction 의 기본 템플릿 인자는 DefaultConstructible 요구 사항을 추가적으로 충족하는 지정되지 않은 함수 객체 타입입니다. 인자 없이 해당 타입의 lvalue를 호출하는 것은 아무런 효과가 없습니다.

멤버 타입

이름 정의
arrival_token MoveConstructible , MoveAssignable , Destructible 요구 사항을 충족하는 지정되지 않은 객체 타입

데이터 멤버

멤버 정의
CompletionFunction completion 모든 단계 완료 시 호출되는 완료 함수 객체
( 설명 전용 멤버 객체* )

멤버 함수

barrier 를 생성합니다
(public member function)
barrier 를 파괴합니다
(public member function)
operator=
[deleted]
barrier 는 할당할 수 없습니다
(public member function)
배리어에 도착하고 예상 카운트를 감소시킵니다
(public member function)
위상 완료 단계가 실행될 때까지 위상 동기화 지점에서 블록합니다
(public member function)
배리어에 도착하고 예상 카운트를 1만큼 감소시킨 후, 현재 위상이 완료될 때까지 블록합니다
(public member function)
이후 위상에 대한 초기 예상 카운트와 현재 위상에 대한 예상 카운트를 모두 1만큼 감소시킵니다
(public member function)
상수
[static]
구현에서 지원하는 예상 카운트의 최대값
(public static member function)

참고 사항

기능 테스트 매크로 표준 기능
__cpp_lib_barrier 201907L (C++20) std::barrier
202302L (C++20)
(DR)
단계 완료에 대한 완화된 보장

예제

#include <barrier>
#include <iostream>
#include <string>
#include <syncstream>
#include <thread>
#include <vector>
int main()
{
    const auto workers = {"Anil", "Busara", "Carl"};
    auto on_completion = []() noexcept
    {
        // 여기서는 잠금이 필요하지 않음
        static auto phase =
            "... 완료\n"
            "정리 중...\n";
        std::cout << phase;
        phase = "... 완료\n";
    };
    std::barrier sync_point(std::ssize(workers), on_completion);
    auto work = [&](std::string name)
    {
        std::string product = "  " + name + " 작업함\n";
        std::osyncstream(std::cout) << product;  // ok, op<< 호출은 원자적
        sync_point.arrive_and_wait();
        product = "  " + name + " 정리함\n";
        std::osyncstream(std::cout) << product;
        sync_point.arrive_and_wait();
    };
    std::cout << "시작 중...\n";
    std::vector<std::jthread> threads;
    threads.reserve(std::size(workers));
    for (auto const& worker : workers)
        threads.emplace_back(work, worker);
}

가능한 출력:

시작 중...
  Anil 작업함
  Carl 작업함
  Busara 작업함
... 완료
정리 중...
  Busara 정리함
  Carl 정리함
  Anil 정리함
... 완료

결함 보고서

다음 동작 변경 결함 보고서들은 이전에 발표된 C++ 표준에 소급 적용되었습니다.

DR 적용 대상 게시된 동작 올바른 동작
P2588R3 C++20 이전 단계 완료 보장이 하드웨어 가속을 방해할 수 있음 완화됨

참고 항목

(C++20)
1회용 스레드 배리어
(클래스)