aha, the concurrency model is documented here
https://www.boost.org/doc/libs/1_66_0/doc/html/boost_asio/overview/core/threads.html ,
"Thread pools
Multiple threads may call io_context::run() to set up a pool of threads from which completion handlers may be invoked. This approach may also be used with post() as a means to perform arbitrary computational tasks across a thread pool.
Note that all threads that have joined an io_context's pool are considered equivalent, and the io_context may distribute work across them in an arbitrary fashion. "