2015-02-04 4 views
3

나는 내 응용 프로그램이 정확하게 2000 마이크로 잠을하려면 :정밀 시간 수면

#include <iostream> 
#include <chrono> 
#include <thread> 

std::cout << "Hello waiter" << std::endl; 
std::chrono::microseconds dura(2000); 

auto start = std::chrono::system_clock::now(); 
std::this_thread::sleep_for(dura); 
auto end = std::chrono::system_clock::now(); 

auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(end - start); 
std::cout << "Waited for " << elapsed.count() << " microseconds" << std::endl; 

이이 차이가 오는가

Waited for 2620 microseconds 

결과? 더 나은 (더 정확한) 방법이 있습니까?

감사합니다. cppreference에서 인용

+1

운영 체제에는 스레드를 예약해야하는 시점에 대한 자체 의견이 있으며 절전 시간 최소 * dura ms 만 보장됩니다. – dlf

+0

dlf가 옳다. OS의 세부 사항은 흥미 롭다. 가상 머신에서 테스트를 실행하는 것도 영향을 줄 수 있습니다. –

+0

Busy waiting은 프로세서 리소스를 소모하면서 더 나은 정밀도를 제공 할 수 있습니다. 그것은 무역이다. –

답변

1

분명히 sleep_for은 정확하지 않습니다. 이 문제의 해결 방법은 원하는 기간에 도달 할 때까지 while 루프를 입력하는 것입니다. 이것은 응용 프로그램을 정확히 2000 마이크로 초 동안 "잠자기"상태로 만듭니다.

bool sleep = true; 
while(sleep) 
{ 
    auto now = std::chrono::system_clock::now(); 
    auto elapsed = std::chrono::duration_cast<std::chrono::microseconds>(now - start); 
    if (elapsed.count() > 2000) 
     sleep = false; 
} 
2

(sleep_for 참조)

이 기능으로 인해 일정 또는 자원 경합 sleep_duration 지연보다 긴 시간 동안 차단된다.

가장 가능성있는 설명이라고 생각합니다. 세부 사항은 환경, 특히 OS에 따라 다릅니다.

일반적으로 나는 그것을 피할 수있는 이식성이없는 방법을 선호합니다 (이식성이없는 옵션에는 스레드 우선 순위 증가 또는 nice 수준 감소가 포함됩니다).

시간 차이의 원인은 외부 시계 조정 (예 : ntp 데몬으로 인한 것)입니다. steady_clock을 사용하면 시계 조정에 대한 휴대용 보험입니다.

+0

'system_clock'대신'steady_clock'을 사용하면 차이가 없습니다. 나는 또한 같은 결과로'high_resolution_clock'을 시도했다. – user2926577

+0

@ user2926577 예, 시계 조정이 매우 드물게 발생하기 때문에 귀하의 경우에는이를 조정할 수 있다고 생각합니다. high_resolution_clock은 진드기 입상 성을 향상시킵니다. 당신의 messurement에서는 600ms 이상 떨어져 있습니다. 이것은'std ::: chrono :: system_clock :: period'에 비해 훨씬 많습니다. 여전히 OS 의존 문제와 같습니다. –