2015-01-14 2 views
0

나는 아래와 같이 20 밀리 - 초 동안 세마포어를 기다리고 싶습니다. 그러나 tv_sec와 tv_nsec의 값이 매우 커지면 인쇄합니다.특정 시간 동안 sem_timedwait() 특정 시간 동안 sem_timedwait()

누구든지이 아래의 코드를 이해하는 데 도움이 될 수 있습니다.

if (clock_gettime(CLOCK_REALTIME, &ts) == -1) 
    { 
     //throw error 
    } 
ts.tv_nsec += 20000000; 
ts.tv_sec += ts.tv_nsec/1000000000; 
ts.tv_nsec %= 1000000000; 

sem_timedwait(&semaphore, &ts) 
+0

'printf'는 즉각적인 것이 아니며 그럴 수도 있습니다. –

+0

큰 값은 무엇입니까? 'tv_sec'는 약 14 억,'tv_nsec'는 10 억 이하입니까? – mch

+0

"억"이라고 생각하는 것은 무엇입니까? "10 억"은 다른 언어에서 모호합니다. '10 ** 9' 또는'10 ** 12'? – alk

답변

1

크기가 커야합니다. clock_gettime (CLOCK_REALTIME, & ts)는 Epoch 시간 이후의 틱을 제공하며 반환 된 값에 추가됩니다.

http://man7.org/linux/man-pages/man2/clock_gettime.2.html 매뉴얼 페이지.

모든 구현은 CLOCK_REALTIME으로 식별되는 시스템 전체의 실시간 클럭을 지원합니다. 시간은 초로부터 초와 나노초를 나타냅니다. 시간이 변경되면 상대적 간격의 타이머는 영향을받지 않지만 절대 시간의 타이머가 영향을받습니다. sem_timedwait (3) 발

- 리눅스 매뉴얼 페이지

int sem_timedwait(sem_t *sem, const struct timespec *abs_timeout); 

에포크

0
  1. clock_gettime 때문에 초 나노초 절대적인 제한을 지정하는 구조로 abs_timeout 인자 포인트를 검색하는 현재 "날짜 및 시간"을 특정 형식으로 표시합니다.
  2. timespec 구조의 작업으로 현재 날짜가 업데이트됩니다 : 현재 날짜 +20 MS는 (다음 nsec "오버 플로우는"우리는 sec를 증가해야한다면 그것은 테두리 효과를 처리하기 위해 시도) : 그래서 ts
  3. 세마포어는 sem_post 또는 제한 시간을 기다리는 당신의 세마포어 마감일이 포함되어 있습니다.
관련 문제