2010-06-09 3 views
10

pthread_cond_timedwait 함수는 time timespec 구조에서 절대 시간을 필요로합니다.pthread_cond_timedwait과 함께 사용할 시간 함수는 무엇입니까?

절대 시간을 얻기 위해 사용하는 시간 함수는 무엇입니까? 나는 웹상에서 많은 예를 보았고 거의 모든 시간 함수를 사용했다. (ftime, clock, gettimeofday, clock_gettime (가능한 모든 시계 _...)

pthread_cond_timedwait는 절대 시간을 사용합니다.이 대기 시간은 컴퓨터의 시간을 변경하면 영향을 받습니까? 시간 함수 중 하나 인 델타 시간을 얻거나 추가하는 사이에 기계의 시간이 변경되면 대기 시간에 영향을 미칩니다 상대 시간이있는 이벤트를 기다릴 가능성이 있습니까?

답변

13

사용할 함수는 조건 변수의 시계 ID가 clock_gettime()입니다. 이 클럭 ID는 기본적으로 CLOCK_REALTIME이지만 이 호출 된 pthread_condattr_t으로 조건 변수를 초기화하여 변경할 수 있습니다 (예 : CLOCK_MONOTONIC).

time()을 사용하는 것은 tv_secclock_gettime(CLOCK_REALTIME)과 동일하다는 보장이 없기 때문에 좋지 않습니다. 어떤 경우에는 프로그램이 통화 대기 중일 수 있습니다. time()은 잠시 전에 이미 clock_gettime(CLOCK_REALTIME)에 도달 한 초에 도달 할 수 있습니다.

+4

clock_gettime (CLOCK_MONOTONIC)은 시스템의 시간을 변경함으로써 영향을받지 않는 시간을 얻는 방법입니다. 조건의 속성을 CLOCK_MONOTONIC으로 pthread_condattr_setclock로 초기화하면 pthread_cond_timedwait이 상대 시간으로 대기하게됩니다. – Vincent

0

timespec 추가 초 단위의 초 단위 시간 (time_t)입니다. 상대 시간은 cond_relative_timed_wait입니다.

To obtai n 현재 시스템 시간은 time_t 양식 호출 time(NULL);에서 "time.h". 더 정확하게 사용하려면

timespec ts; 
clock_gettime(CLOCK_REALTIME, &ts); 

또한 나노초를 반환합니다.

다른 기능도 사용할 수 있지만 최종 결과는 초 수와 나노초 수로 변환해야합니다.

+2

cond_relative_timed_wait() 함수의 정의를 찾을 수 없습니다. 정의 된 곳은 어디입니까? – Vincent

2

나는 clock_gettimeCLOCK_REALTIME을 사용했습니다. 만족스럽게 작동하고 타임 아웃을위한 절대 timespec을 쉽게 만들 수 있습니다.

실제로 대기 설정을 수행하는 동안 컴퓨터 시간이 빨라질 가능성이 있습니다. 일반적으로 이것이 중요 할만큼 작은 시간을 기다리고 있다면, 어쨌든 당신이 희망하는 웨이크 업 시간에 거의 다가 가지 못할 것입니다. 시간 요청 통화가 이루어진 시점까지 요청한 시간이 이미 지나갔 으면 즉시 깨워 야합니다.

Solaris는 pthread_cond_reltimedwait_np을 제공하지만 (np는 이식성이 없음을 의미 함) Linux에서는 이러한 기능을 인식하지 못합니다. 절대 시간을 기다리는 것이 좋습니다. 필요하다면 상대적으로 자신을 기다리십시오.

+1

'CLOCK_MONOTONIC' 기반 버전이 없다는 것이 유감입니다. – caf

+0

CLOCK_REALTIME이 설정된 clock_gettime은 저수준 자원에서 "heavy"입니까? – Vincent

+0

나는 그렇게 생각하지 않는다. 그러나 알아내는 가장 좋은 방법은 특정 어플리케이션을 프로파일 링하는 것이고,'clock_gettime'이 중요한 문제 일 뿐이라면 그것을 최적화하려고 시도한다는 것을 보여준다. –

관련 문제