// Construct a timer without setting an expiry time.
boost::asio::deadline_timertimer(io_service);// Set an expiry time relative to now.
timer.expires_from_now(boost::posix_time::seconds(5));// Wait for the timer to expire.
timer.wait();

Changing the expiry time of a timer while there are pending asynchronous
waits causes those wait operations to be cancelled. To ensure that the action
associated with the timer is performed only once, use something like this:
used:

The boost::asio::basic_deadline_timer::expires_from_now() function cancels
any pending asynchronous waits, and returns the number of asynchronous
waits that were cancelled. If it returns 0 then you were too late and the
wait handler has already been executed, or will soon be executed. If it
returns 1 then the wait handler was successfully cancelled.

If a wait handler is cancelled, the boost::system::error_code passed to
it contains the value boost::asio::error::operation_aborted.