Namespaces
Variants

std:: condition_variable

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
condition_variable
(C++11)
(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
헤더 파일에 정의됨 <condition_variable>
class condition_variable ;
(C++11부터)

std::condition_variable 는 하나 이상의 스레드를 다른 스레드가 공유 변수( 조건 )를 수정하고 std::condition_variable 에 알림을 보낼 때까지 차단하는 데 사용되는 동기화 기본 요소로, std::mutex 와 함께 사용됩니다.

공유 변수를 수정하려는 스레드는 다음을 수행해야 합니다:

  1. std::mutex 획득하기 (일반적으로 std::lock_guard 를 통해).
  2. 잠금을 보유한 상태에서 공유 변수 수정하기.
  3. std::condition_variable 에 대해 notify_one 또는 notify_all 호출하기 (잠금 해제 후 수행 가능).

공유 변수가 원자적(atomic)이라도 수정 사항을 대기 중인 스레드에 올바르게 전파하기 위해서는 뮤텍스를 소유한 상태에서 수정해야 합니다.

std::condition_variable 을 기다리려는 모든 스레드는 반드시:

  1. 공유 변수를 보호하는 데 사용되는 뮤텍스에 대해 std:: unique_lock < std:: mutex > 을 획득합니다.
  2. 다음 중 하나를 수행합니다:
  1. 조건을 확인하여 이미 업데이트되어 통지된 경우를 대비합니다.
  2. std::condition_variable 에서 wait , wait_for , 또는 wait_until 을 호출합니다 (뮤텍스를 원자적으로 해제하고 스레드 실행을 일시 중단하며, 조건 변수가 통지되거나, 타임아웃이 만료되거나, spurious wakeup 이 발생할 때까지 대기한 후, 반환하기 전에 뮤텍스를 원자적으로 획득합니다).
  3. 조건을 확인하고 만족되지 않으면 대기를 재개합니다.
또는:
  1. wait , wait_for , 및 wait_until 의 조건자 오버로드를 사용하며, 이는 동일한 세 단계를 수행합니다.

std::condition_variable 는 오직 std:: unique_lock < std:: mutex > 와만 동작하며, 일부 플랫폼에서 최대 효율성을 보장합니다. std::condition_variable_any BasicLockable 객체와 함께 동작하는 조건 변수를 제공하며, std::shared_lock 과 같은 객체와 사용할 수 있습니다.

조건 변수는 wait , wait_for , wait_until , notify_one notify_all 멤버 함수들의 동시 호출을 허용합니다.

클래스 std::condition_variable StandardLayoutType 입니다. 이 클래스는 CopyConstructible , MoveConstructible , CopyAssignable , 또는 MoveAssignable 이 아닙니다.

목차

중첩 타입

이름 정의
native_handle_type 구현 정의

멤버 함수

객체를 생성함
(public member function)
객체를 소멸함
(public member function)
operator=
[deleted]
복사 할당 불가
(public member function)
알림
대기 중인 하나의 스레드에 알림
(public member function)
대기 중인 모든 스레드에 알림
(public member function)
대기
조건 변수가 깨어날 때까지 현재 스레드를 차단함
(public member function)
조건 변수가 깨어나거나 지정된 시간 제한이 지날 때까지 현재 스레드를 차단함
(public member function)
조건 변수가 깨어나거나 지정된 시간 점에 도달할 때까지 현재 스레드를 차단함
(public member function)
네이티브 핸들
네이티브 핸들을 반환함
(public member function)

예제

std::condition_variable std::mutex 와 조합되어 스레드 간 통신을 용이하게 하는 데 사용됩니다.

#include <condition_variable>
#include <iostream>
#include <mutex>
#include <string>
#include <thread>
std::mutex m;
std::condition_variable cv;
std::string data;
bool ready = false;
bool processed = false;
void worker_thread()
{
    // main()이 데이터를 보낼 때까지 대기
    std::unique_lock lk(m);
    cv.wait(lk, []{ return ready; });
    // 대기 후 락을 소유함
    std::cout << "Worker thread is processing data\n";
    data += " after processing";
    // 데이터를 main()으로 다시 전송
    processed = true;
    std::cout << "Worker thread signals data processing completed\n";
    // 수동 잠금 해제는 알림 전에 수행되어, 대기 중인 스레드가
    // 깨어났다가 다시 블록되는 상황을 방지함 (자세한 내용은 notify_one 참조)
    lk.unlock();
    cv.notify_one();
}
int main()
{
    std::thread worker(worker_thread);
    data = "Example data";
    // 작업자 스레드에 데이터 전송
    {
        std::lock_guard lk(m);
        ready = true;
        std::cout << "main() signals data ready for processing\n";
    }
    cv.notify_one();
    // 작업자 대기
    {
        std::unique_lock lk(m);
        cv.wait(lk, []{ return processed; });
    }
    std::cout << "Back in main(), data = " << data << '\n';
    worker.join();
}

출력:

main() signals data ready for processing
Worker thread is processing data
Worker thread signals data processing completed
Back in main(), data = Example data after processing

참고 항목

모든 락 타입과 연관된 조건 변수를 제공함
(클래스)
(C++11)
기본 상호 배제 기능을 제공함
(클래스)
(C++11)
엄격한 범위 기반 뮤텍스 소유권 래퍼를 구현함
(클래스 템플릿)
이동 가능한 뮤텍스 소유권 래퍼를 구현함
(클래스 템플릿)