Concurrency support library (since C++11)
C++는 스레드, 원자적 연산, 상호 배제, 조건 변수, 그리고 퓨처에 대한 내장 지원을 포함합니다.
목차 |
스레드
스레드는 프로그램이 여러 프로세서 코어에서 실행될 수 있도록 합니다.
|
헤더 파일에 정의됨
<thread>
|
|
|
(C++11)
|
별도 스레드 관리
(클래스) |
|
(C++20)
|
std::thread
자동 조인 및 취소 지원 포함
(클래스) |
현재 스레드 관리 함수 |
|
|
네임스페이스에 정의됨
this_thread
|
|
|
(C++11)
|
구현체에 스레드 실행 재조정을 제안함
(함수) |
|
(C++11)
|
현재 스레드의 스레드 ID를 반환함
(함수) |
|
(C++11)
|
지정된 시간 동안 현재 스레드의 실행을 중지함
(함수) |
|
(C++11)
|
지정된 시간 포인트까지 현재 스레드의 실행을 중지함
(함수) |
협력적 취소 (C++20부터)
컴포넌트 stop source , stop token , 그리고 stop callback 은 일반적으로 결과가 더 이상 필요하지 않기 때문에 작업이 적시에 실행을 중단하도록 비동기적으로 요청하는 데 사용될 수 있습니다. 이러한 요청을 stop request 라고 합니다.
이러한 구성 요소는 stop state 에 대한 공유 액세스의 의미론을 지정합니다. 동일한 정지 상태를 참조하는 이러한 구성 요소 중 어떤 것을 모델링하는 객체는 각각 연관된 stop source, stop token 또는 stop callback입니다.
|
개념들
|
(C++26부터) |
이들은 다음과 같이 설계되었습니다:
- 실행을 협력적으로 취소하기 위해, 예를 들어 std::jthread 와 같은 경우에 사용됩니다,
- std::condition_variable_any 대기 함수를 인터럽트하기 위해,
|
(C++26부터) |
- 또는 사용자 정의 실행 관리 구현을 위한 것입니다.
사실, 이들은 무언가를 "중지"시키는 데 사용될 필요조차 없으며, 대신 예를 들어 스레드 안전한 일회성 함수 호출 트리거로 사용될 수 있습니다.
|
헤더 파일에 정의됨
<stop_token>
|
|
Stop 토큰 타입 |
|
|
(C++20)
|
std::jthread
취소 요청이 있었는지 질의하기 위한 인터페이스
(클래스) |
|
(C++26)
|
중지가 가능하지도 요청되지도 않는 stop 토큰 인터페이스를 제공함
(클래스) |
|
(C++26)
|
연관된
std::inplace_stop_source
객체의 stop 상태를 참조하는 stop 토큰
(클래스) |
Stop 소스 타입 |
|
|
(C++20)
|
하나 이상의
std::jthread
를 중지시키는 요청을 나타내는 클래스
(클래스) |
|
(C++26)
|
stop 상태의 단독 소유자인
stoppable-source
(클래스) |
Stop 콜백 타입 |
|
|
(C++20)
|
std::jthread
취소 시 콜백을 등록하기 위한 인터페이스
(클래스 템플릿) |
|
(C++26)
|
std::inplace_stop_token
을 위한 stop 콜백
(클래스 템플릿) |
|
(C++26)
|
주어진 stop 토큰 타입에 대한 콜백 타입을 얻음
(별칭 템플릿) |
개념 (C++20부터) |
|
|
(C++26)
|
stop 요청에 대한 질의와 stop 요청이 가능한지 여부를 허용하는 stop 토큰의 기본 인터페이스를 명시함
(개념) |
|
(C++26)
|
중지를 허용하지 않는 stop 토큰을 명시함
(개념) |
|
(C++26)
|
타입이 연관된 stop 토큰의 팩토리이며 그에 대해 stop 요청을 할 수 있음을 명시함
( 설명 전용 개념* ) |
|
(C++26)
|
주어진 stop 토큰 타입으로 콜백을 등록하기 위한 인터페이스를 명시함
( 설명 전용 개념* ) |
캐시 크기 접근 (since C++17)
|
헤더 파일에 정의됨
<new>
|
|
|
거짓 공유를 피하기 위한 최소 오프셋
진짜 공유를 촉진하기 위한 최대 오프셋 (상수) |
|
원자적 연산
이러한 구성 요소는 잠금 없는 동시성 프로그래밍을 위한 세분화된 원자적 연산을 제공합니다. 각 원자적 연산은 동일한 객체와 관련된 다른 모든 원자적 연산과 관련하여 나눌 수 없습니다. 원자적 객체는 데이터 경쟁이 없습니다 .
|
헤더 파일에 정의됨
<atomic>
|
|
Atomic types |
|
|
(C++11)
|
bool, 정수형,
부동소수점,
(since C++20)
및 포인터 타입에 대한 atomic 클래스 템플릿과 특수화
(클래스 템플릿) |
|
(C++20)
|
비원자적 객체에 대한 원자적 연산을 제공함
(클래스 템플릿) |
원자적 타입 연산 |
|
|
(C++11)
|
원자적 타입의 연산들이 잠금 없는 방식인지 확인합니다
(함수 템플릿) |
|
(C++11)
(C++11)
|
원자적 객체의 값을 비원자적 인수로 원자적으로 대체합니다
(함수 템플릿) |
|
(C++11)
(C++11)
|
원자적 객체에 저장된 값을 원자적으로 획득합니다
(함수 템플릿) |
|
(C++11)
(C++11)
|
원자적 객체의 값을 비원자적 인수로 원자적으로 교체하고 원자적 객체의 이전 값을 반환합니다
(함수 템플릿) |
|
원자적 객체의 값을 비원자적 인자와 비교하여 같으면 원자적 교환을 수행하고, 다르면 원자적 로드를 수행합니다
(함수 템플릿) |
|
|
(C++11)
(C++11)
|
원자적 객체에 비원자적 값을 더하고 원자적 객체의 이전 값을 얻음
(함수 템플릿) |
|
(C++11)
(C++11)
|
원자적 객체에서 비원자적 값을 빼고 원자적 객체의 이전 값을 얻는다
(함수 템플릿) |
|
(C++11)
(C++11)
|
원자적 객체를 비원자적 인자와의 비트 AND 연산 결과로 대체하고 원자적 객체의 이전 값을 획득합니다
(함수 템플릿) |
|
(C++11)
(C++11)
|
원자적 객체를 비원자적 인자와의 비트 OR 연산 결과로 대체하고 원자적 객체의 이전 값을 획득합니다
(함수 템플릿) |
|
(C++11)
(C++11)
|
원자적 객체를 비원자적 인자와의 비트별 XOR 연산 결과로 대체하고 원자적 객체의 이전 값을 획득합니다
(함수 템플릿) |
|
(C++26)
(C++26)
|
원자적 객체를 비원자적 인자를 사용한
std::max
연산 결과로 대체하고 원자적 객체의 이전 값을 획득합니다
(함수 템플릿) |
|
(C++26)
(C++26)
|
원자적 객체를 비원자적 인자를 사용한
std::min
연산 결과로 대체하고 원자적 객체의 이전 값을 획득합니다
(함수 템플릿) |
|
(C++20)
(C++20)
|
스레드를 차단하여 알림을 받고 원자적 값이 변경될 때까지 대기
(함수 템플릿) |
|
(C++20)
|
atomic_wait에서 차단된 스레드에 알림을 전송
(함수 템플릿) |
|
(C++20)
|
atomic_wait에서 차단된 모든 스레드에 알림을 전송
(함수 템플릿) |
플래그 유형 및 연산 |
|
|
(C++11)
|
락-프리 불리언 원자 타입
(클래스) |
|
(C++11)
(C++11)
|
플래그를 원자적으로
true
로 설정하고 이전 값을 반환합니다
(함수) |
|
(C++11)
(C++11)
|
플래그의 값을 원자적으로
false
로 설정합니다
(함수) |
|
(C++20)
(C++20)
|
플래그의 값을 원자적으로 반환합니다
(함수) |
|
(C++20)
(C++20)
|
스레드를 차단하여 알림을 받고 플래그가 변경될 때까지 대기
(함수) |
|
(C++20)
|
atomic_flag_wait에서 블록된 스레드에 알림을 전송
(함수) |
|
(C++20)
|
atomic_flag_wait에서 대기 중인 모든 스레드에 알림
(함수) |
초기화 |
|
|
(C++11)
(C++20에서 사용 중단됨)
|
기본 생성된 atomic 객체의 비원자적 초기화
(함수 템플릿) |
|
(C++11)
(C++20에서 사용 중단됨)
|
정적 저장 기간을 가진 원자 변수의 상수 초기화
(함수 매크로) |
|
(C++11)
|
std::atomic_flag
를
false
로 초기화합니다
(매크로 상수) |
메모리 동기화 순서 |
|
|
(C++11)
|
주어진 원자적 연산에 대한 메모리 순서 제약 조건을 정의합니다
(enum) |
|
(C++11)
(C++26에서 사용 중단됨)
|
지정된 객체를
std::memory_order_consume
의존성 트리에서 제거합니다
(함수 템플릿) |
|
(C++11)
|
범용 메모리 순서 의존적 펜스 동기화 기본 요소
(함수) |
|
(C++11)
|
같은 스레드에서 실행되는 스레드와 시그널 핸들러 간의 펜스
(함수) |
|
헤더 파일에 정의됨
<stdatomic.h>
|
|
C 호환성 매크로 (since C++23) |
|
|
(C++23)
|
_Atomic
(
T
)
가
std::
atomic
<
T
>
와 동일하도록 하는 호환성 매크로
(함수 매크로) |
_Atomic
매크로나 비매크로 전역 네임스페이스 선언들 중 어느 것도
<stdatomic.h>
이외의 다른 C++ 표준 라이브러리 헤더에서는 제공되지 않습니다.
상호 배제
상호 배제 알고리즘은 여러 스레드가 공유 자원에 동시에 접근하는 것을 방지합니다. 이는 데이터 레이스를 방지하고 스레드 간 동기화를 지원합니다.
|
헤더 파일에 정의됨
<mutex>
|
|
|
(C++11)
|
기본 상호 배제 기능 제공
(클래스) |
|
(C++11)
|
타임아웃과 함께 잠금을 구현하는 상호 배제 기능 제공
(클래스) |
|
(C++11)
|
동일 스레드에서 재귀적으로 잠글 수 있는 상호 배제 기능 제공
(클래스) |
|
(C++11)
|
동일 스레드에서 재귀적으로 잠글 수 있고
타임아웃과 함께 잠금을 구현하는 상호 배제 기능 제공 (클래스) |
|
헤더 파일에 정의됨
<shared_mutex>
|
|
|
(C++17)
|
공유 상호 배제 기능 제공
(클래스) |
|
(C++14)
|
공유 상호 배제 기능 제공 및 타임아웃과 함께 잠금 구현
(클래스) |
일반 뮤텍스 관리 |
|
|
헤더 파일에 정의됨
<mutex>
|
|
|
(C++11)
|
엄격한 범위 기반 뮤텍스 소유권 래퍼 구현
(클래스 템플릿) |
|
(C++17)
|
데드락 방지 다중 뮤텍스 RAII 래퍼
(클래스 템플릿) |
|
(C++11)
|
이동 가능한 뮤텍스 소유권 래퍼 구현
(클래스 템플릿) |
|
(C++14)
|
이동 가능한 공유 뮤텍스 소유권 래퍼 구현
(클래스 템플릿) |
|
잠금 전략을 지정하는 데 사용되는 태그
(태그) |
|
일반 잠금 알고리즘 |
|
|
(C++11)
|
try_lock
에 대한 반복 호출을 통해 뮤텍스 소유권 획득 시도
(함수 템플릿) |
|
(C++11)
|
지정된 뮤텍스들을 잠그고, 사용 불가능한 경우 블록
(함수 템플릿) |
일회 호출 |
|
|
(C++11)
|
call_once
가 함수를 한 번만 호출하도록 보장하는 도우미 객체
(클래스) |
|
(C++11)
|
다중 스레드에서 호출되더라도 함수를 한 번만 호출
(함수 템플릿) |
조건 변수
조건 변수는 여러 스레드가 서로 통신할 수 있도록 하는 동기화 기본 요소입니다. 특정 수의 스레드가 다른 스레드로부터 진행 가능하다는 통지를 (시간 제한과 함께) 대기할 수 있게 합니다. 조건 변수는 항상 뮤텍스와 연관되어 있습니다.
|
헤더에 정의됨
<condition_variable>
|
|
|
(C++11)
|
std::unique_lock
과 연관된 조건 변수를 제공함
(클래스) |
|
(C++11)
|
모든 락 타입과 연관된 조건 변수를 제공함
(클래스) |
|
(C++11)
|
이 스레드가 완전히 종료될 때
notify_all
호출을 스케줄링함
(함수) |
|
(C++11)
|
조건 변수에 대한 타임아웃 대기의 가능한 결과들을 나열함
(열거형) |
세마포어 (since C++20)
세마포어는 공유 자원에 대한 동시 접근을 제한하는 데 사용되는 경량 동기화 기본 요소입니다. 둘 중 어느 것을 사용해도 충분한 상황에서는 세마포어가 조건 변수보다 더 효율적일 수 있습니다.
|
헤더 파일에 정의됨
<semaphore>
|
|
|
(C++20)
|
음수가 아닌 리소스 카운트를 모델링하는 세마포어
(클래스 템플릿) |
|
(C++20)
|
오직 두 가지 상태만을 가지는 세마포어
(타입별칭) |
래치와 배리어 (since C++20)
래치와 배리어는 예상되는 수의 스레드가 도착할 때까지 임의의 수의 스레드가 블록될 수 있도록 하는 스레드 조정 메커니즘입니다. 래치는 재사용할 수 없지만, 배리어는 반복적으로 사용할 수 있습니다.
|
헤더에 정의됨
<latch>
|
|
|
(C++20)
|
단일 사용 스레드 배리어
(클래스) |
|
헤더에 정의됨
<barrier>
|
|
|
(C++20)
|
재사용 가능 스레드 배리어
(클래스 템플릿) |
Futures
표준 라이브러리는 비동기 작업(즉, 별도의 스레드에서 실행되는 함수)이 반환하는 값을 얻고, 던져진 예외를 잡을 수 있는 기능을 제공합니다. 이러한 값들은 공유 상태(shared state) 에서 전달되며, 비동기 작업은 여기에 반환값을 기록하거나 예외를 저장할 수 있습니다. 그리고 이 공유 상태는 해당 상태를 참조하는 std::future 또는 std::shared_future 인스턴스를 보유한 다른 스레드들이 검사하고, 대기하며, 다른 방식으로 조작할 수 있습니다.
|
헤더에 정의됨
<future>
|
|
|
(C++11)
|
비동기적 획득을 위한 값을 저장함
(클래스 템플릿) |
|
(C++11)
|
함수를 패키징하여 비동기적 획득을 위한 반환 값을 저장함
(클래스 템플릿) |
|
(C++11)
|
비동기적으로 설정되는 값을 기다림
(클래스 템플릿) |
|
(C++11)
|
(다른 future들이 참조할 수 있는) 비동기적으로 설정되는 값을 기다림
(클래스 템플릿) |
|
(C++11)
|
함수를 비동기적으로 실행하고(새 스레드에서 실행될 수 있음) 결과를 담을
std::future
를 반환함
(함수 템플릿) |
|
(C++11)
|
std::async
의 실행 정책을 지정함
(열거형) |
|
(C++11)
|
std::future
와
std::shared_future
에서 수행된 시간 제한 대기의 결과를 지정함
(열거형) |
Future 오류 |
|
|
(C++11)
|
future 또는 promise와 관련된 오류를 보고함
(클래스) |
|
(C++11)
|
future 오류 범주를 식별함
(함수) |
|
(C++11)
|
future 오류 코드를 식별함
(열거형) |
안전한 회수 (since C++26)
안전한 회수 기법들은 접근-삭제 경합을 직관적으로 해결하는 데 가장 빈번하게 사용됩니다.
Read-Copy-Update 메커니즘 |
|
|
헤더에 정의됨
<rcu>
|
|
|
(C++26)
|
객체가 RCU로 보호되도록 허용
(클래스 템플릿) |
|
(C++26)
|
RCU 보호 영역을 제공
(클래스) |
|
(C++26)
|
std::rcu_domain
타입의 정적 지속 시간 객체에 대한 참조를 반환
(함수) |
|
(C++26)
|
RCU 도메인에서 보호 영역이 잠금 해제될 때까지 차단
(함수) |
|
(C++26)
|
RCU 도메인에서 예약된 연산을 평가하고 모든 선행 평가가 완료될 때까지 차단할 수 있음
(함수) |
|
(C++26)
|
RCU 도메인에서 지정된 함수의 평가를 예약하고, 메모리를 할당하며, 예약된 평가를 호출할 수 있음
(함수 템플릿) |
Hazard 포인터 |
|
|
헤더에 정의됨
<hazard_pointer>
|
|
|
(C++26)
|
객체가 hazard 보호 가능하도록 허용
(클래스 템플릿) |
|
(C++26)
|
어느 시점에서든 최대 하나의 스레드만 소유할 수 있는 단일 작성자 다중 판독기 포인터
(클래스) |
|
(C++26)
|
hazard 포인터를 생성
(함수) |
참고 항목
|
C 문서
for
동시성 지원 라이브러리
|