std:: barrier
|
헤더에 정의됨
<barrier>
|
||
|
template
<
class
CompletionFunction
=
/* see below */
>
class barrier ; |
(C++20부터) | |
클래스 템플릿
std::barrier
는 알려진 크기의 스레드 그룹이 배리어에 도달할 때까지 해당 그룹의 모든 스레드를 차단하는 스레드 조정 메커니즘을 제공합니다.
std::latch
와 달리, 배리어는 재사용 가능합니다: 도착한 스레드 그룹이 차단 해제되면 배리어를 다시 사용할 수 있습니다.
std::latch
와 달리, 배리어는 스레드를 차단 해제하기 전에 가능적으로 비어 있을 수 있는 호출 가능 객체를 실행합니다.
배리어 객체의 수명은 하나 이상의 단계로 구성됩니다. 각 단계는 대기 스레드가 차단하는
단계 동기화 지점
을 정의합니다. 스레드는 배리어에 도착할 수 있지만,
arrive
를 호출하여
단계 동기화 지점
에서의 대기를 지연할 수 있습니다. 이러한 스레드는 나중에
wait
를 호출하여
단계 동기화 지점
에서 차단될 수 있습니다.
배리어 phase 는 다음 단계들로 구성됩니다:
-
예상 카운트
는
arrive또는arrive_and_drop호출 시마다 감소합니다. -
예상 카운트가 0에 도달하면
페이즈 완료 단계
가 실행됩니다. 즉,
completion이 호출되고 페이즈 동기화 지점에서 대기 중인 모든 스레드의 차단이 해제됩니다. 완료 단계의 종료는 강력하게 선행합니다 완료 단계에 의해 차단 해제된 모든 호출의 반환 시점에.
예상 카운트가 0에 도달한 후 정확히 한 번, 하나의 스레드가arrive,arrive_and_drop, 또는wait호출 중에 완료 단계를 실행합니다. 단, 어떤 스레드도wait를 호출하지 않을 경우 완료 단계 실행 여부는 구현에 따라 정의됩니다. -
완료 단계가 종료되면, 예상 카운트는 생성 시 지정된 값에서 이후 발생한
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회용 스레드 배리어
(클래스) |