forma estándar de realizar un apagado limpio con Boost.Asio

Estoy escribiendo un programa de servidor multiplataforma en C ++ usando Boost.Asio. Siguiendo el ejemplo del Servidor HTTP enesta página, Me gustaría manejar una solicitud de terminación de usuario sin usar API específicas de implementación. Inicialmente intenté usar la biblioteca de señales C estándar, pero no pude encontrar un patrón de diseño adecuado para Asio. losEjemplo de Windows el diseño parece parecerse a la biblioteca de señales más cercana, pero hay una condición de carrera en la que se puede llamar al controlador de la consola ctrl después de que el objeto del servidor ha sido destruido. Estoy tratando de evitar un comportamiento indefinido según lo especificado por el estándar C ++.

¿Existe una forma estándar (y correcta) de detener el servidor?

Para ilustrar problemas con el uso de la biblioteca de señales C:

#include <csignal>
#include <functional>
#include <boost/asio.hpp>

using std::signal;
using boost::asio::io_service;

namespace
{
    std::function<void ()> sighandler;
}

extern "C"
{
    static void handle_signal(int);
}

void handle_signal(int)
{
    // error - undefined behavior
    sighandler();
}

int main()
{
    io_service s;
    sighandler = std::bind(&io_service::stop, &s);
    auto old_sigint = signal(SIGINT, &handle_signal);
    if (old_sigint == SIG_IGN)
        // race condition?  raise SIGINT before I can set ignore back
        signal(SIGINT, SIG_IGN);
    auto old_sigterm = signal(SIGTERM, &handle_signal);
    if (old_sigterm == SIG_IGN)
        // race condition?  raise SIGTERM before I can set ignore back
        signal(SIGTERM, SIG_IGN);
    s.run();
    // reset signals so I can clear reference to io_service
    if (old_sigterm != SIG_IGN)
        signal(SIGTERM, SIG_DFL);
    if (old_sigint != SIG_IGN)
        signal(SIGINT, SIG_DFL);
    // clear reference to io_service, but can I be sure that handle_signal
    // isn't being executed?
    sighandler = nullptr;
    // io_service is destroyed
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta