2013-02-13 12 views
9

Come potrebbe essere letta a:boost :: deadline_timer può non funzionare quando l'orologio di sistema viene modificato

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

un deadline_timer che timeout periodicamente e che viene implementata utilizzando deadline_timer :: expires_at() (come l'esempio in Boost Timer Tutorial, 3th example) avrà esito negativo se l'ora del sistema viene modificata (ad esempio, utilizzando il comando date, se il sistema operativo è Linux).

Esiste un modo semplice e appropriato per eseguire questa operazione ora, utilizzando Boost? Non voglio usare deadline_timer :: expires_from_now() perché potrei verificare che sia meno preciso dell'aggiornamento "manuale" del tempo di scadenza.

Come soluzione temporale, decido di, prima di impostare un nuovo valore expires_at, calcolare il periodo di tempo tra now() e expires_at(). Se è più del doppio del ritardo periodico, uso eccezionalmente expires_from_now() per risincronizzare con il nuovo tempo assoluto.

+3

Soluzione temporale, bel gioco di parole :) – Thomas

risposta

9

In Boost 1.49+, Boost.Asio fornisce steady_timer. Questo timer utilizza chrono::steady_clock, un orologio monotono che non è influenzato dalle modifiche all'orologio di sistema.

Se non è possibile utilizzare Boost 1.49+, controllare i timer o gli orologi per le modifiche è una soluzione alternativa ragionevole. Mentre è un dettaglio di implementazione, Boost.Asio può limitare la quantità di tempo trascorso in attesa di un evento nel suo reattore, in modo che possa rilevare periodicamente le modifiche all'ora del sistema. Ad esempio, l'implementazione del reattore utilizzando epoll attenderà un massimo di 5 minuti. Pertanto, senza forzare un interrupt sul reattore (come l'impostazione di un nuovo tempo di scadenza su un timer), può richiedere Boost.Asio fino a 5 minuti prima di rilevare le modifiche all'ora del sistema.

Problemi correlati