The Boost library provides for this in Boost.Asio, and explicitly covers this in its tutorials:
Synchronous timer, i.e. waiting until the timer expires.
Asynchronous timer, i.e. continuing with your program and having the callback function invoked when the timer expires.
If you didn't find the Boost library when searching the web for C++, your google-fu is weak. ;-)