2010-05-01 3 views
2

C++ 0x는 지정된 시간에 도달 할 때까지 뮤텍스를 잠그고 뮤텍스가 잠겨 있는지 여부를 나타내는 부울을 반환합니다.시간 초과 잠금이 C++ 0x에서 시간 초과 예외를 발생시키지 않는 이유는 무엇입니까?

template <class Clock, class Duration> 
bool try_lock_until(const chrono::time_point<Clock, 
        Duration>& abs_time); 

일부 컨텍스트에서는 시간 초과로 인해 잠금이 실패하는 예외적 인 상황을 고려합니다. 이 경우 예외가 더 충당되어야합니다.

차이를 만들기 위해 잠그기 전에 시간에 도달하면 lock_until을 사용하여 시간 초과 예외를 얻을 수 있습니다.

template <class Clock, class Duration> 
void lock_until(const chrono::time_point<Clock, 
       Duration>& abs_time); 

일부 상황에서는 lock_until이 더 적절하다고 생각합니까? 그렇다면 어느 것입니까? 그렇다면 try_lock_until이 항상 더 나은 선택 일 것입니다.

+3

이 질문에서 try_lock_until에 특정한 것이 있습니까? 상황은 (a) 수신자가 의미있는 가치를 반환 할 수 있는지, 그리고 (b) 발신자가 계속할 수 있는지 여부에 따라 상황이 "예외적"인지 아닌지 여부. 우리는 (b)에 대해 논평 할 수 없기 때문에, 예외를 던지는 것이'try_lock_until'에 false로 반환하는 현명한 응답인지 여부를 말할 수 없습니다. 모든 호출자는 예외를 throw하여 false 값을 반환하는 함수에 응답 할 수 있습니다. C++ 표준 라이브러리는 메모리 부족 및 값을 반환 할 수없는 경우 (예 : 동적 캐스트 참조로 실패한 경우)를 제외하고 많이 throw하지 않습니다. –

+0

@ 스티브 귀하의 의견은 lock_until이 필요하지 않은 이유 일 수 있다고 생각합니다. 답변을 추가 할 수 있습니까? 내 질문에 try_lock_until false를 반환하면 시간 초과 예외를 throw 할 수 있습니다. 어떤 상황에서 그렇다면? –

답변

2

반환 값을 확인하고 예외를 throw 할 수는 없습니까?

if (! my_lock.try_lock_until(my_start_time)) { 
    throw realtime_error("Couldn't start in time!"); 
} 
또한

, 어떤 시간 관련 예외 클래스를 표시하지 않는 FCD의 스레딩 및 예외 라이브러리를 통해 간단하게 살펴, 자연스럽게 던져 std::에 대한 lock_until에는 종류가 없습니다.

+0

@ Potato 나는 스티브에게 내가 준 조언을 따라 왔음을 알았다. 스티브에게 직접 그렇게시켜야합니다. –

+0

@Vic 의견에서 아이디어를 복사하지 않았습니다. 기분이 나아진다면 CW로 만들 수 있습니다. – Potatoswatter

+0

@Potatowatter 나는 당신이 똑같은 아이디어를 가질 수 있다고 생각합니다. 나는 표준에 의해 제공되는 인터페이스가 최소한이고 사용자가 원하는 것을 무엇이든 할 수 있도록 동의한다. 그것은 내 질문의 일부이기 때문에 당신은 lock_until을 찾지 못하는 것이 정상입니다. 질문은 작성한 코드 또는 일반적인 예외를 던지는 특정 함수를 선호하는지 여부입니다. –