2013-02-13 9 views
9

jak można było przeczytać na stronie:boost :: deadline_timer może zawieść, gdy zegar systemowy jest modyfikowany

https://svn.boost.org/trac/boost/ticket/3504

deadline_timer że limity czasu okresowo i który jest realizowany z wykorzystaniem deadline_timer :: expires_at() (jak na przykład w Boost Timer Tutorial, 3th example) prawdopodobnie zakończy się niepowodzeniem, jeśli czas systemowy zostanie zmodyfikowany (na przykład za pomocą polecenia date, jeśli system operacyjny to Linux).

Czy istnieje prosty i właściwy sposób wykonania tej operacji teraz, używając funkcji Boost? Nie chcę używać deadline_timer :: expires_from_now(), ponieważ mogłem sprawdzić, czy jest on mniej dokładny niż "ręcznie" aktualizując czas wygaśnięcia.

Jako rozwiązanie tymczasowe decyduję się, przed ustawieniem nowej wartości expires_at, obliczyć przedział czasu między teraz() i expires_at(). Jeśli jest to więcej niż dwukrotność opóźnienia okresowego, to wyjątkowo korzystam z funkcji expires_from_now() w celu ponownego zsynchronizowania z nowym czasem bezwzględnym.

+3

Tymczasowe rozwiązanie, dobra gra słów :) – Thomas

Odpowiedz

9

W Zwiększ 1.49+, Boost.Asio zapewnia steady_timer. Ten zegar używa chrono::steady_clock, monotonicznych zegarów, na które nie wpływają zmiany w zegarze systemowym.

Jeśli nie możesz użyć Boost 1.49+, sprawdzanie timerów lub zegarów zmian jest rozsądnym alternatywnym rozwiązaniem. Chociaż jest to szczegół implementacji, Boost.Asio może ograniczyć czas oczekiwania na zdarzenie w jego reaktorze, aby mógł okresowo wykrywać zmiany w czasie systemowym. Na przykład implementacja reaktora przy użyciu epoll będzie czekać maksymalnie 5 minut. Tak więc, bez wymuszania przerwania w reaktorze (jak na przykład ustawienie nowego czasu wygaśnięcia w zegarze), może to zająć Boost.Asio do 5 minut przed wykryciem zmian w czasie systemowym.

Powiązane problemy