impulsar asio deadline_timer async_wait (N segundos) dos veces dentro de N segundos causa la operación cancelada

Lo que quiero es cuando una cola de mensajes recibe un int N, la función del controlador se llamará después de N segundos. a continuación está mi código.

Funciona bien si la duración en segundos de dos colas de mensajes cercanos es mayor que int N, pero el controlador imprimirá "Operación cancelada" en un controlador cuando los segundos de duración entre dos colas de mensajes recibidos sean menores que N, que no es lo que yo querer.

Agradecería mucho cualquier ayuda.

#include <boost/asio.hpp>
#include <zmq.h>
#include <boost/thread.hpp>
#include <iostream>

boost::asio::io_service io_service;

void* context = zmq_ctx_new();
void* sock_pull = zmq_socket(context, ZMQ_PULL);


void handler(const boost::system::error_code &ec) {
    std::cout << "hello, world" << "\t" << ec.message() << std::endl;
}

void run() {
    io_service.run();
}

void thread_listener() {

     int nRecv;
     boost::asio::deadline_timer timer(io_service, boost::posix_time::seconds(0));
     while( true ) {
         zmq_recv(sock_pull, &nRecv, sizeof(nRecv), 0);
         std::cout << nRecv << std::endl;
         timer.expires_from_now(boost::posix_time::seconds(nRecv));
         timer.async_wait(handler);
     }

 }

 int main(int argc, char* argv[]) {

     boost::asio::io_service::work work(io_service);

     zmq_bind(sock_pull, "tcp://*:60000");
     boost::thread tThread(thread_listener);
     boost::thread tThreadRun(run);
     tThread.join();
     tThreadRun.join();
     return 0;

 }

Respuestas a la pregunta(1)

Su respuesta a la pregunta