Namespaces
Variants

Concurrency support library (since C++11)

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)
(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

C++는 스레드, 원자적 연산, 상호 배제, 조건 변수, 그리고 퓨처에 대한 내장 지원을 포함합니다.

목차

스레드

스레드는 프로그램이 여러 프로세서 코어에서 실행될 수 있도록 합니다.

헤더 파일에 정의됨 <thread>
(C++11)
별도 스레드 관리
(클래스)
(C++20)
std::thread 자동 조인 및 취소 지원 포함
(클래스)
현재 스레드 관리 함수
네임스페이스에 정의됨 this_thread
(C++11)
구현체에 스레드 실행 재조정을 제안함
(함수)
(C++11)
현재 스레드의 스레드 ID를 반환함
(함수)
(C++11)
지정된 시간 동안 현재 스레드의 실행을 중지함
(함수)
지정된 시간 포인트까지 현재 스레드의 실행을 중지함
(함수)

협력적 취소 (C++20부터)

컴포넌트 stop source , stop token , 그리고 stop callback 은 일반적으로 결과가 더 이상 필요하지 않기 때문에 작업이 적시에 실행을 중단하도록 비동기적으로 요청하는 데 사용될 수 있습니다. 이러한 요청을 stop request 라고 합니다.

이러한 구성 요소는 stop state 에 대한 공유 액세스의 의미론을 지정합니다. 동일한 정지 상태를 참조하는 이러한 구성 요소 중 어떤 것을 모델링하는 객체는 각각 연관된 stop source, stop token 또는 stop callback입니다.

개념들 stoppable-source , stoppable_token , 그리고 stoppable-callback-for 은 각각 정지 소스, 정지 토큰, 그리고 정지 콜백의 요구되는 구문과 모델 의미론을 명시합니다.

(C++26부터)

이들은 다음과 같이 설계되었습니다:

  • execution::connect 에 의해 생성된 비동기 연산의 중단 완료를 수행하기 위해,
(C++26부터)
  • 또는 사용자 정의 실행 관리 구현을 위한 것입니다.

사실, 이들은 무언가를 "중지"시키는 데 사용될 필요조차 없으며, 대신 예를 들어 스레드 안전한 일회성 함수 호출 트리거로 사용될 수 있습니다.

헤더 파일에 정의됨 <stop_token>
Stop 토큰 타입
(C++20)
std::jthread 취소 요청이 있었는지 질의하기 위한 인터페이스
(클래스)
중지가 가능하지도 요청되지도 않는 stop 토큰 인터페이스를 제공함
(클래스)
연관된 std::inplace_stop_source 객체의 stop 상태를 참조하는 stop 토큰
(클래스)
Stop 소스 타입
하나 이상의 std::jthread 를 중지시키는 요청을 나타내는 클래스
(클래스)
stop 상태의 단독 소유자인 stoppable-source
(클래스)
Stop 콜백 타입
std::jthread 취소 시 콜백을 등록하기 위한 인터페이스
(클래스 템플릿)
std::inplace_stop_token 을 위한 stop 콜백
(클래스 템플릿)
주어진 stop 토큰 타입에 대한 콜백 타입을 얻음
(별칭 템플릿)
개념 (C++20부터)
stop 요청에 대한 질의와 stop 요청이 가능한지 여부를 허용하는 stop 토큰의 기본 인터페이스를 명시함
(개념)
중지를 허용하지 않는 stop 토큰을 명시함
(개념)
타입이 연관된 stop 토큰의 팩토리이며 그에 대해 stop 요청을 할 수 있음을 명시함
( 설명 전용 개념* )
주어진 stop 토큰 타입으로 콜백을 등록하기 위한 인터페이스를 명시함
( 설명 전용 개념* )

캐시 크기 접근 (since C++17)

헤더 파일에 정의됨 <new>
거짓 공유를 피하기 위한 최소 오프셋
진짜 공유를 촉진하기 위한 최대 오프셋
(상수)

원자적 연산

이러한 구성 요소는 잠금 없는 동시성 프로그래밍을 위한 세분화된 원자적 연산을 제공합니다. 각 원자적 연산은 동일한 객체와 관련된 다른 모든 원자적 연산과 관련하여 나눌 수 없습니다. 원자적 객체는 데이터 경쟁이 없습니다 .

헤더 파일에 정의됨 <atomic>
Atomic types
(C++11)
bool, 정수형, 부동소수점, (since C++20) 및 포인터 타입에 대한 atomic 클래스 템플릿과 특수화
(클래스 템플릿)
(C++20)
비원자적 객체에 대한 원자적 연산을 제공함
(클래스 템플릿)
원자적 타입 연산
원자적 타입의 연산들이 잠금 없는 방식인지 확인합니다
(함수 템플릿)
원자적 객체의 값을 비원자적 인수로 원자적으로 대체합니다
(함수 템플릿)
원자적 객체에 저장된 값을 원자적으로 획득합니다
(함수 템플릿)
원자적 객체의 값을 비원자적 인수로 원자적으로 교체하고 원자적 객체의 이전 값을 반환합니다
(함수 템플릿)
원자적 객체의 값을 비원자적 인자와 비교하여 같으면 원자적 교환을 수행하고, 다르면 원자적 로드를 수행합니다
(함수 템플릿)
원자적 객체에 비원자적 값을 더하고 원자적 객체의 이전 값을 얻음
(함수 템플릿)
원자적 객체에서 비원자적 값을 빼고 원자적 객체의 이전 값을 얻는다
(함수 템플릿)
원자적 객체를 비원자적 인자와의 비트 AND 연산 결과로 대체하고 원자적 객체의 이전 값을 획득합니다
(함수 템플릿)
원자적 객체를 비원자적 인자와의 비트 OR 연산 결과로 대체하고 원자적 객체의 이전 값을 획득합니다
(함수 템플릿)
원자적 객체를 비원자적 인자와의 비트별 XOR 연산 결과로 대체하고 원자적 객체의 이전 값을 획득합니다
(함수 템플릿)
원자적 객체를 비원자적 인자를 사용한 std::max 연산 결과로 대체하고 원자적 객체의 이전 값을 획득합니다
(함수 템플릿)
원자적 객체를 비원자적 인자를 사용한 std::min 연산 결과로 대체하고 원자적 객체의 이전 값을 획득합니다
(함수 템플릿)
스레드를 차단하여 알림을 받고 원자적 값이 변경될 때까지 대기
(함수 템플릿)
atomic_wait에서 차단된 스레드에 알림을 전송
(함수 템플릿)
atomic_wait에서 차단된 모든 스레드에 알림을 전송
(함수 템플릿)
플래그 유형 및 연산
락-프리 불리언 원자 타입
(클래스)
플래그를 원자적으로 true 로 설정하고 이전 값을 반환합니다
(함수)
플래그의 값을 원자적으로 false 로 설정합니다
(함수)
플래그의 값을 원자적으로 반환합니다
(함수)
스레드를 차단하여 알림을 받고 플래그가 변경될 때까지 대기
(함수)
atomic_flag_wait에서 블록된 스레드에 알림을 전송
(함수)
atomic_flag_wait에서 대기 중인 모든 스레드에 알림
(함수)
초기화
(C++11) (C++20에서 사용 중단됨)
기본 생성된 atomic 객체의 비원자적 초기화
(함수 템플릿)
(C++11) (C++20에서 사용 중단됨)
정적 저장 기간을 가진 원자 변수의 상수 초기화
(함수 매크로)
std::atomic_flag false 로 초기화합니다
(매크로 상수)
메모리 동기화 순서
주어진 원자적 연산에 대한 메모리 순서 제약 조건을 정의합니다
(enum)
(C++11) (C++26에서 사용 중단됨)
지정된 객체를 std::memory_order_consume 의존성 트리에서 제거합니다
(함수 템플릿)
범용 메모리 순서 의존적 펜스 동기화 기본 요소
(함수)
같은 스레드에서 실행되는 스레드와 시그널 핸들러 간의 펜스
(함수)
헤더 파일에 정의됨 <stdatomic.h>
C 호환성 매크로 (since C++23)
(C++23)
_Atomic ( T ) std:: atomic < T > 와 동일하도록 하는 호환성 매크로
(함수 매크로)

_Atomic 매크로나 비매크로 전역 네임스페이스 선언들 중 어느 것도 <stdatomic.h> 이외의 다른 C++ 표준 라이브러리 헤더에서는 제공되지 않습니다.

상호 배제

상호 배제 알고리즘은 여러 스레드가 공유 자원에 동시에 접근하는 것을 방지합니다. 이는 데이터 레이스를 방지하고 스레드 간 동기화를 지원합니다.

헤더 파일에 정의됨 <mutex>
(C++11)
기본 상호 배제 기능 제공
(클래스)
타임아웃과 함께 잠금을 구현하는 상호 배제 기능 제공
(클래스)
동일 스레드에서 재귀적으로 잠글 수 있는 상호 배제 기능 제공
(클래스)
동일 스레드에서 재귀적으로 잠글 수 있고
타임아웃과 함께 잠금을 구현하는 상호 배제 기능 제공
(클래스)
헤더 파일에 정의됨 <shared_mutex>
공유 상호 배제 기능 제공
(클래스)
공유 상호 배제 기능 제공 및 타임아웃과 함께 잠금 구현
(클래스)
일반 뮤텍스 관리
헤더 파일에 정의됨 <mutex>
(C++11)
엄격한 범위 기반 뮤텍스 소유권 래퍼 구현
(클래스 템플릿)
데드락 방지 다중 뮤텍스 RAII 래퍼
(클래스 템플릿)
이동 가능한 뮤텍스 소유권 래퍼 구현
(클래스 템플릿)
이동 가능한 공유 뮤텍스 소유권 래퍼 구현
(클래스 템플릿)
잠금 전략을 지정하는 데 사용되는 태그
(태그)
일반 잠금 알고리즘
(C++11)
try_lock 에 대한 반복 호출을 통해 뮤텍스 소유권 획득 시도
(함수 템플릿)
(C++11)
지정된 뮤텍스들을 잠그고, 사용 불가능한 경우 블록
(함수 템플릿)
일회 호출
(C++11)
call_once 가 함수를 한 번만 호출하도록 보장하는 도우미 객체
(클래스)
(C++11)
다중 스레드에서 호출되더라도 함수를 한 번만 호출
(함수 템플릿)

조건 변수

조건 변수는 여러 스레드가 서로 통신할 수 있도록 하는 동기화 기본 요소입니다. 특정 수의 스레드가 다른 스레드로부터 진행 가능하다는 통지를 (시간 제한과 함께) 대기할 수 있게 합니다. 조건 변수는 항상 뮤텍스와 연관되어 있습니다.

헤더에 정의됨 <condition_variable>
std::unique_lock 과 연관된 조건 변수를 제공함
(클래스)
모든 락 타입과 연관된 조건 변수를 제공함
(클래스)
이 스레드가 완전히 종료될 때 notify_all 호출을 스케줄링함
(함수)
(C++11)
조건 변수에 대한 타임아웃 대기의 가능한 결과들을 나열함
(열거형)

세마포어 (since C++20)

세마포어는 공유 자원에 대한 동시 접근을 제한하는 데 사용되는 경량 동기화 기본 요소입니다. 둘 중 어느 것을 사용해도 충분한 상황에서는 세마포어가 조건 변수보다 더 효율적일 수 있습니다.

헤더 파일에 정의됨 <semaphore>
음수가 아닌 리소스 카운트를 모델링하는 세마포어
(클래스 템플릿)
오직 두 가지 상태만을 가지는 세마포어
(타입별칭)

래치와 배리어 (since C++20)

래치와 배리어는 예상되는 수의 스레드가 도착할 때까지 임의의 수의 스레드가 블록될 수 있도록 하는 스레드 조정 메커니즘입니다. 래치는 재사용할 수 없지만, 배리어는 반복적으로 사용할 수 있습니다.

헤더에 정의됨 <latch>
(C++20)
단일 사용 스레드 배리어
(클래스)
헤더에 정의됨 <barrier>
(C++20)
재사용 가능 스레드 배리어
(클래스 템플릿)

Futures

표준 라이브러리는 비동기 작업(즉, 별도의 스레드에서 실행되는 함수)이 반환하는 값을 얻고, 던져진 예외를 잡을 수 있는 기능을 제공합니다. 이러한 값들은 공유 상태(shared state) 에서 전달되며, 비동기 작업은 여기에 반환값을 기록하거나 예외를 저장할 수 있습니다. 그리고 이 공유 상태는 해당 상태를 참조하는 std::future 또는 std::shared_future 인스턴스를 보유한 다른 스레드들이 검사하고, 대기하며, 다른 방식으로 조작할 수 있습니다.

헤더에 정의됨 <future>
(C++11)
비동기적 획득을 위한 값을 저장함
(클래스 템플릿)
함수를 패키징하여 비동기적 획득을 위한 반환 값을 저장함
(클래스 템플릿)
(C++11)
비동기적으로 설정되는 값을 기다림
(클래스 템플릿)
(다른 future들이 참조할 수 있는) 비동기적으로 설정되는 값을 기다림
(클래스 템플릿)
(C++11)
함수를 비동기적으로 실행하고(새 스레드에서 실행될 수 있음) 결과를 담을 std::future 를 반환함
(함수 템플릿)
(C++11)
std::async 의 실행 정책을 지정함
(열거형)
std::future std::shared_future 에서 수행된 시간 제한 대기의 결과를 지정함
(열거형)
Future 오류
future 또는 promise와 관련된 오류를 보고함
(클래스)
future 오류 범주를 식별함
(함수)
future 오류 코드를 식별함
(열거형)

안전한 회수 (since C++26)

안전한 회수 기법들은 접근-삭제 경합을 직관적으로 해결하는 데 가장 빈번하게 사용됩니다.

Read-Copy-Update 메커니즘
헤더에 정의됨 <rcu>
객체가 RCU로 보호되도록 허용
(클래스 템플릿)
(C++26)
RCU 보호 영역을 제공
(클래스)
std::rcu_domain 타입의 정적 지속 시간 객체에 대한 참조를 반환
(함수)
RCU 도메인에서 보호 영역이 잠금 해제될 때까지 차단
(함수)
RCU 도메인에서 예약된 연산을 평가하고 모든 선행 평가가 완료될 때까지 차단할 수 있음
(함수)
(C++26)
RCU 도메인에서 지정된 함수의 평가를 예약하고, 메모리를 할당하며, 예약된 평가를 호출할 수 있음
(함수 템플릿)
Hazard 포인터
헤더에 정의됨 <hazard_pointer>
객체가 hazard 보호 가능하도록 허용
(클래스 템플릿)
어느 시점에서든 최대 하나의 스레드만 소유할 수 있는 단일 작성자 다중 판독기 포인터
(클래스)
hazard 포인터를 생성
(함수)

참고 항목

C 문서 for 동시성 지원 라이브러리