2013/6/27 Arash Partow <arash@partow.net>
The trick is to click the link, read and comprehend the code example, at which point an astute individual may realize that CK has gone to a lot of effort to integrate coroutine semantics into stock asio within the context of C++11.

boost::asio:yield_context - uses internaly boost.coroutine
boost::fibers::asio::yield - uses internaly boost.fiber

both rely on boost.context
 
1. Do I use another library to provide the functionality I think I may need?

as I wrote it depends on your programming model - with coroutine-version (boost::asio:yield_context) you only operate in the asio-related context
with fiber version (boost::fibers::asio::yield) you get a broader range of usage == for instance the one-thread-for-one client (10k-problem) can easliy be used with
boost.fiber + boost.asio (boost::fibers::asio::yield) without degrading over-all performance (at a certain amount of threads scheduling overhead inside the OS counts + context switching between threads).
you can use mutex, condition-vars .... to sync fibers etc.
 
Oh and btw the example quoted above quite clearly deals with the OP's original problem in a clean, efficient and simple to understand manner and so to the many other examples related to timeouts in the asio example set, all it takes is a bit of tinkering.

boost.fiber contains this example adapted to use boost.fiber