condition_variable 클래스
unique_lock<mutex>
형식의 mutex
가 있는 경우 condition_variable
클래스를 사용하여 이벤트를 대기합니다. 이 형식의 개체는 unique_lock 뮤텍스>>를 condition_variable_any<<형식의 개체보다 성능이 더 좋을 수 있습니다.
구문
class condition_variable;
멤버
생성자
속성 | 설명 |
---|---|
condition_variable | condition_variable 개체를 생성합니다. |
함수
속성 | 설명 |
---|---|
native_handle | Condition_variable 핸들을 나타내는 구현 관련 형식을 반환합니다. |
notify_all | condition_variable 개체를 대기 중인 모든 스레드를 차단 해제합니다. |
notify_one | condition_variable 개체를 대기 중인 스레드 중 하나를 차단 해제합니다. |
wait | 스레드를 차단합니다. |
wait_for | 스레드를 차단하고 스레드가 차단 해제되는 시간 간격을 설정합니다. |
wait_until | 스레드를 차단하고 스레드가 차단 해제되는 최대 시점을 설정합니다. |
condition_variable
condition_variable
개체를 생성합니다.
condition_variable();
설명
메모리가 부족한 경우 생성자에서 not_enough_memory
오류 코드가 있는 system_error 개체를 throw합니다. 몇 가지 다른 리소스를 사용할 수 없기 때문에 개체를 생성할 수 없는 경우 생성자에서 resource_unavailable_try_again
오류 코드가 있는 system_error
개체를 throw합니다.
native_handle
Condition_variable 핸들을 나타내는 구현 관련 형식을 반환합니다.
native_handle_type native_handle();
Return Value
native_handle_type
은 동시성 런타임 내부 데이터 구조에 대한 포인터로 정의됩니다.
notify_all
condition_variable
개체를 대기 중인 모든 스레드를 차단 해제합니다.
void notify_all() noexcept;
notify_one
condition_variable
개체를 기다리는 스레드 중 하나를 차단 해제합니다.
void notify_one() noexcept;
wait
스레드를 차단합니다.
void wait(unique_lock<mutex>& Lck);
template <class Predicate>
void wait(unique_lock<mutex>& Lck, Predicate Pred);
매개 변수
Pred
true
또는 false
를 반환하는 모든 식입니다.
설명
첫 번째 메서드는 condition_variable
개체에서 notify_one 또는 notify_all에 대한 호출을 통해 신호를 받을 때까지 차단합니다. 또한 의사적으로 대기 모드를 해제할 수도 있습니다.
사실 두 번째 방법은 다음 코드를 실행합니다.
while(!Pred())
wait(Lck);
wait_for
스레드를 차단하고 스레드가 차단 해제되는 시간 간격을 설정합니다.
template <class Rep, class Period>
cv_status wait_for(
unique_lock<mutex>& Lck,
const chrono::duration<Rep, Period>& Rel_time);
template <class Rep, class Period, class Predicate>
bool wait_for(
unique_lock<mutex>& Lck,
const chrono::duration<Rep, Period>& Rel_time,
Predicate Pred);
매개 변수
Rel_time
스레드가 대기 모드를 해제하기 전까지의 시간을 지정하는 chrono::duration
개체입니다.
Pred
true
또는 false
를 반환하는 모든 식입니다.
Return Value
첫 번째 메서드는 Rel_time 경과했을 때 대기가 종료되는 경우 반환 cv_status::timeout
됩니다. 그렇지 않은 경우 메서드는 cv_status::no_timeout
를 반환합니다.
두 번째 메서드는 Pred의 값을 반환합니다.
설명
첫 번째 메서드는 개체가 condition_variable
notify_one 또는 notify_all 호출로 신호를 받거나 시간 간격 Rel_time 경과할 때까지 차단됩니다. 또한 의사적으로 대기 모드를 해제할 수도 있습니다.
사실 두 번째 방법은 다음 코드를 실행합니다.
while(!Pred())
if(wait_for(Lck, Rel_time) == cv_status::timeout)
return Pred();
return true;
wait_until
스레드를 차단하고 스레드가 차단 해제되는 최대 시점을 설정합니다.
template <class Clock, class Duration>
cv_status wait_until(
unique_lock<mutex>& Lck,
const chrono::time_point<Clock, Duration>& Abs_time);
template <class Clock, class Duration, class Predicate>
bool wait_until(
unique_lock<mutex>& Lck,
const chrono::time_point<Clock, Duration>& Abs_time,
Predicate Pred);
cv_status wait_until(
unique_lock<mutex>& Lck,
const xtime* Abs_time);
template <class Predicate>
bool wait_until(
unique_lock<mutex>& Lck,
const xtime* Abs_time,
Predicate Pred);
매개 변수
Abs_time
chrono::time_point 개체입니다.
Pred
true
또는 false
를 반환하는 모든 식입니다.
Return Value
Abs_time 경과할 때 대기가 종료되는 경우 형식 반환을 반환 cv_status
cv_status::timeout
하는 메서드입니다. 그렇지 않으면 메서드는 cv_status::no_timeout
을 반환합니다.
Pred 값을 반환 bool
하는 메서드입니다.
설명
첫 번째 메서드는 condition_variable
개체에서 notify_one 또는 notify_all에 대한 호출을 통해 신호를 받을 때까지 또는 Abs_time
까지 차단합니다. 또한 의사적으로 대기 모드를 해제할 수도 있습니다.
사실 두 번째 방법은 다음 코드를 실행합니다.
while(!Pred())
if(wait_until(Lck, Abs_time) == cv_status::timeout)
return Pred();
return true;
세 번째와 네 번째 메서드는 xtime
형식의 개체에 대한 포인터를 사용하여 chrono::time_point
개체를 대체합니다. xtime
개체는 신호를 기다리는 최대 시간을 지정합니다.