std:: condition_variable
|
헤더 파일에 정의됨
<condition_variable>
|
||
|
class
condition_variable
;
|
(C++11부터) | |
std::condition_variable
는 하나 이상의 스레드를 다른 스레드가 공유 변수(
조건
)를 수정하고
std::condition_variable
에 알림을 보낼 때까지 차단하는 데 사용되는 동기화 기본 요소로,
std::mutex
와 함께 사용됩니다.
공유 변수를 수정하려는 스레드는 다음을 수행해야 합니다:
- std::mutex 획득하기 (일반적으로 std::lock_guard 를 통해).
- 잠금을 보유한 상태에서 공유 변수 수정하기.
-
std::condition_variable에 대해 notify_one 또는 notify_all 호출하기 (잠금 해제 후 수행 가능).
공유 변수가 원자적(atomic)이라도 수정 사항을 대기 중인 스레드에 올바르게 전파하기 위해서는 뮤텍스를 소유한 상태에서 수정해야 합니다.
std::condition_variable
을 기다리려는 모든 스레드는 반드시:
- 공유 변수를 보호하는 데 사용되는 뮤텍스에 대해 std:: unique_lock < std:: mutex > 을 획득합니다.
- 다음 중 하나를 수행합니다:
-
- 조건을 확인하여 이미 업데이트되어 통지된 경우를 대비합니다.
-
std::condition_variable에서 wait , wait_for , 또는 wait_until 을 호출합니다 (뮤텍스를 원자적으로 해제하고 스레드 실행을 일시 중단하며, 조건 변수가 통지되거나, 타임아웃이 만료되거나, spurious wakeup 이 발생할 때까지 대기한 후, 반환하기 전에 뮤텍스를 원자적으로 획득합니다). - 조건을 확인하고 만족되지 않으면 대기를 재개합니다.
- 또는:
- 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)
|
기본 상호 배제 기능을 제공함
(클래스) |
|
(C++11)
|
엄격한 범위 기반 뮤텍스 소유권 래퍼를 구현함
(클래스 템플릿) |
|
(C++11)
|
이동 가능한 뮤텍스 소유권 래퍼를 구현함
(클래스 템플릿) |