Asio Service Handler para Stdin Keypress

Me he adaptadopaso 3 del tutorial Boost asio para ejecutar para siempre, y mostrar "tick" y "tock" una vez por segundo en lugar del contador:

#include <iostream>
#include <boost/asio.hpp>
#include <boost/bind.hpp>
#include <boost/date_time/posix_time/posix_time.hpp>

void print(const boost::system::error_code& /*e*/,
    boost::asio::deadline_timer* t, int* count)
{
    if( !((*count) % 2) )
        std::cout << "tick\n";
    else
        std::cout << "tock\n";

    ++(*count);

    t->expires_at(t->expires_at() + boost::posix_time::seconds(1));
    t->async_wait(boost::bind(print,
          boost::asio::placeholders::error, t, count));
}

int main()
{
  boost::asio::io_service io;

  int count = 0;
  boost::asio::deadline_timer t(io, boost::posix_time::seconds(1));
  t.async_wait(boost::bind(print,
        boost::asio::placeholders::error, &t, &count));

  io.run();

  std::cout << "Final count is " << count << "\n";

  return 0;
}

Ahora quiero poder manejar de forma asíncrona una pulsación de tecla en la entrada estándar. ¿Hay un controlador io_service que pueda usar para responder a las pulsaciones de teclas, sin bloquear el tiempo de espera o espera?

Por ejemplo, me gustaría poder implementar una función de controlador similar a:

void handle_keypress(const boost::error_code&,
    char c)
{
    std::cout << "Tap '" << c << "'\n";
}

Y espero que mi invocación de este controlador sea algo así como:

  char c = 0;
  boost::asio::stdin_receiver sr(io);
  st.async_wait(boost::bind(handle_keypress, boost::asio::placeholders::error, &c));

  io.run();

¿Es esto algo que puedo hacer con asio, ya sea utilizando un manejador de servicios integrado o escribiendo el mío?

EDITAR, ELABORACIÓN:

he vistoesta pregunta, pero el código vinculado a la respuesta accedida simplemente hace esto enmain:

 while (std::cin.getline(

La aplicación que estoy escribiendo no es este simple gizmo de tick-tock-tap que he descrito anteriormente, sino que será un servidor de multidifusión. Varios subprocesos de trabajo enviarán paquetes a grupos de multidifusión, responderán a los mensajes del subproceso principal y enviarán mensajes de vuelta al subproceso principal. La aplicación, a su vez, será "activada" por la entrada desde la entrada estándar. Por ejemplo, cuando el usuario presiona la tecla "P", la transmisión de multidifusión se detendrá, y cuando se presione "Q", todo se apagará. . En el hilo principal, todo lo que haré en respuesta a estas entradas es enviar mensajes a los hilos de trabajo.

loswhile el bucle anterior no funcionará en mi escenario porque mientras espera la entrada estándar del usuario, el subproceso principal no podrá procesar los mensajes provenientes de los subprocesos de trabajo. Algunos de esos mensajes del subproceso de trabajo generarán salida a la salida estándar.

Respuestas a la pregunta(2)

Su respuesta a la pregunta